[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / GUIInfoManager.cpp
blob835fd306b023c482136e0b11bb6f738981f97a36
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "GUIInfoManager.h"
11 #include "FileItem.h"
12 #include "ServiceBroker.h"
13 #include "URL.h"
14 #include "Util.h"
15 #include "application/ApplicationComponents.h"
16 #include "application/ApplicationPlayer.h"
17 #include "cores/DataCacheCore.h"
18 #include "filesystem/File.h"
19 #include "games/tags/GameInfoTag.h"
20 #include "guilib/guiinfo/GUIInfo.h"
21 #include "guilib/guiinfo/GUIInfoHelper.h"
22 #include "guilib/guiinfo/GUIInfoLabels.h"
23 #include "input/WindowTranslator.h"
24 #include "interfaces/AnnouncementManager.h"
25 #include "interfaces/info/InfoExpression.h"
26 #include "messaging/ApplicationMessenger.h"
27 #include "playlists/PlayListTypes.h"
28 #include "settings/SkinSettings.h"
29 #include "utils/CharsetConverter.h"
30 #include "utils/FileUtils.h"
31 #include "utils/StringUtils.h"
32 #include "utils/URIUtils.h"
33 #include "utils/log.h"
35 #include <algorithm>
36 #include <array>
37 #include <charconv>
38 #include <cmath>
39 #include <functional>
40 #include <iterator>
41 #include <memory>
42 #include <mutex>
44 using namespace KODI;
45 using namespace KODI::GUILIB;
46 using namespace KODI::GUILIB::GUIINFO;
47 using namespace INFO;
49 bool InfoBoolComparator(const InfoPtr &right, const InfoPtr &left)
51 return *right < *left;
54 CGUIInfoManager::CGUIInfoManager(void)
55 : m_currentFile(new CFileItem),
56 m_bools(&InfoBoolComparator)
60 CGUIInfoManager::~CGUIInfoManager(void)
62 delete m_currentFile;
65 void CGUIInfoManager::Initialize()
67 CServiceBroker::GetAppMessenger()->RegisterReceiver(this);
70 /// \brief Translates a string as given by the skin into an int that we use for more
71 /// efficient retrieval of data. Can handle combined strings on the form
72 /// Player.Caching + VideoPlayer.IsFullscreen (Logical and)
73 /// Player.HasVideo | Player.HasAudio (Logical or)
74 int CGUIInfoManager::TranslateString(const std::string &condition)
76 // translate $LOCALIZE as required
77 std::string strCondition(CGUIInfoLabel::ReplaceLocalize(condition));
78 return TranslateSingleString(strCondition);
81 typedef struct
83 const char *str;
84 int val;
85 } infomap;
87 /// \page modules__infolabels_boolean_conditions Infolabels and Boolean conditions
88 /// \tableofcontents
89 ///
90 /// \section modules__infolabels_boolean_conditions_Description Description
91 /// Skins can use boolean conditions with the <b>\<visible\></b> tag or with condition
92 /// attributes. Scripts can read boolean conditions with
93 /// <b>xbmc.getCondVisibility(condition)</b>.
94 ///
95 /// Skins can use infolabels with <b>$INFO[infolabel]</b> or the <b>\<info\></b> tag. Scripts
96 /// can read infolabels with <b>xbmc.getInfoLabel('infolabel')</b>.
97 ///
98 /// @todo [docs] Improve the description and create links for functions
99 /// @todo [docs] Separate boolean conditions from infolabels
100 /// @todo [docs] Order items alphabetically within subsections for a better search experience
101 /// @todo [docs] Order subsections alphabetically
102 /// @todo [docs] Use links instead of bold values for infolabels/bools
103 /// so we can use a link to point users when providing help
107 /// \page modules__infolabels_boolean_conditions
108 /// \section modules_list_infolabels_booleans List of Infolabels and Boolean conditions
109 /// \subsection modules__infolabels_boolean_conditions_GlobalBools Global
110 /// \table_start
111 /// \table_h3{ Labels, Type, Description }
112 /// \table_row3{ <b>`true`</b>,
113 /// \anchor Global_True
114 /// _boolean_,
115 /// @return Always evaluates to **true**.
116 /// <p>
117 /// }
118 /// \table_row3{ <b>`false`</b>,
119 /// \anchor Global_False
120 /// _boolean_,
121 /// @return Always evaluates to **false**.
122 /// <p>
123 /// }
124 /// \table_row3{ <b>`yes`</b>,
125 /// \anchor Global_Yes
126 /// _boolean_,
127 /// @return same as \link Global_True `true` \endlink.
128 /// <p>
129 /// }
130 /// \table_row3{ <b>`no`</b>,
131 /// \anchor Global_No
132 /// _boolean_,
133 /// @return same as \link Global_False `false` \endlink.
134 /// <p>
135 /// }
136 /// \table_end
138 /// -----------------------------------------------------------------------------
140 /// \page modules__infolabels_boolean_conditions
141 /// \subsection modules__infolabels_boolean_conditions_Addon Addon
142 /// \table_start
143 /// \table_h3{ Labels, Type, Description }
144 /// \table_row3{ <b>`Addon.SettingStr(addon_id\,setting_id)`</b>,
145 /// \anchor Addon_SettingString
146 /// _string_,
147 /// @return The string value of the setting `setting_id` belonging to the addon with the id `addon_id`.
148 /// @param addon_id - the id of the addon
149 /// @param setting_id - the addon setting
150 /// <p><hr>
151 /// @skinning_v20 **[New Infolabel]** \link Addon_SettingString `Addon.SettingStr(addon_id\,setting_id)`\endlink
152 /// <p>
153 /// }
154 /// \table_row3{ <b>`Addon.SettingBool(addon_id\,setting_id)`</b>,
155 /// \anchor Addon_SettingBool
156 /// _boolean_,
157 /// @return **True** if the setting `setting_id` belonging to the addon with the id `addon_id` is **True**\, **False** otherwise.
158 /// @note The provided setting with `setting_id` must be a boolean setting type. Otherwise it will return the boolean info
159 /// default value (which is **False**).
160 /// @param addon_id - the id of the addon
161 /// @param setting_id - the addon setting
162 /// <p><hr>
163 /// @skinning_v20 **[New Boolean Condition]** \link Addon_SettingBool `Addon.SettingBool(addon_id\,setting_id)`\endlink
164 /// <p>
165 /// }
166 /// \table_row3{ <b>`Addon.SettingInt(addon_id\,setting_id)`</b>,
167 /// \anchor Addon_SettingInt
168 /// _integer_,
169 /// @return The integer value of the setting `setting_id` belong to the addon with the id `addon_id`.
170 /// @note The provided setting with `setting_id` must be an integer setting type. Otherwise it will return the integer info
171 /// default value (which is 0).
172 /// @param addon_id - the id of the addon
173 /// @param setting_id - the addon setting
174 /// <p><hr>
175 /// @skinning_v20 **[New Integer Info]** \link Addon_SettingInt `Addon.SettingInt(addon_id\,setting_id)`\endlink
176 /// <p>
177 /// }
178 /// \table_end
180 /// -----------------------------------------------------------------------------
181 const infomap addons[] = {
182 {"settingstr", ADDON_SETTING_STRING},
183 {"settingbool", ADDON_SETTING_BOOL},
184 {"settingint", ADDON_SETTING_INT},
187 /// \page modules__infolabels_boolean_conditions
188 /// \subsection modules__infolabels_boolean_conditions_String String
189 /// \table_start
190 /// \table_h3{ Labels, Type, Description }
191 /// \table_row3{ <b>`String.IsEmpty(info)`</b>,
192 /// \anchor String_IsEmpty
193 /// _boolean_,
194 /// @return **True** if the info is empty.
195 /// @param info - infolabel
196 /// @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
197 /// \link ListItem_Genre `ListItem.Genre` \endlink.
198 /// Please note that string can also be a `$LOCALIZE[]`.
199 /// Also note that in a panelview or similar this only works on the focused item
200 /// <p><hr>
201 /// @skinning_v17 **[New Boolean Condition]** \link String_IsEmpty `String.IsEmpty(info)`\endlink
202 /// <p>
203 /// }
204 /// \table_row3{ <b>`String.IsEqual(info\,string)`</b>,
205 /// \anchor String_IsEqual
206 /// _boolean_,
207 /// @return **True** if the info is equal to the given string.
208 /// @param info - infolabel
209 /// @param string - comparison string
210 /// @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
211 /// \link ListItem_Genre `ListItem.Genre` \endlink.
212 /// Please note that string can also be a `$LOCALIZE[]`.
213 /// Also note that in a panelview or similar this only works on the focused item
214 /// <p><hr>
215 /// @skinning_v17 **[New Boolean Condition]** \link String_IsEqual `String.IsEqual(info\,string)`\endlink
216 /// <p>
217 /// }
218 /// \table_row3{ <b>`String.StartsWith(info\,substring)`</b>,
219 /// \anchor String_StartsWith
220 /// _boolean_,
221 /// @return **True** if the info starts with the given substring.
222 /// @param info - infolabel
223 /// @param substring - substring to check
224 /// @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
225 /// \link ListItem_Genre `ListItem.Genre` \endlink.
226 /// Please note that string can also be a `$LOCALIZE[]`.
227 /// Also note that in a panelview or similar this only works on the focused item
228 /// <p><hr>
229 /// @skinning_v17 **[New Boolean Condition]** \link String_StartsWith `String.StartsWith(info\,substring)`\endlink
230 /// <p>
231 /// }
232 /// \table_row3{ <b>`String.EndsWith(info\,substring)`</b>,
233 /// \anchor String_EndsWith
234 /// _boolean_,
235 /// @return **True** if the info ends with the given substring.
236 /// @param info - infolabel
237 /// @param substring - substring to check
238 /// @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
239 /// \link ListItem_Genre `ListItem.Genre` \endlink.
240 /// Please note that string can also be a `$LOCALIZE[]`.
241 /// Also note that in a panelview or similar this only works on the focused item
242 /// <p><hr>
243 /// @skinning_v17 **[New Boolean Condition]** \link String_EndsWith `String.EndsWith(info\,substring)`\endlink
244 /// <p>
245 /// }
246 /// \table_row3{ <b>`String.Contains(info\,substring)`</b>,
247 /// \anchor String_Contains
248 /// _boolean_,
249 /// @return **True** if the info contains the given substring.
250 /// @param info - infolabel
251 /// @param substring - substring to check
252 /// @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
253 /// \link ListItem_Genre `ListItem.Genre` \endlink.
254 /// Please note that string can also be a `$LOCALIZE[]`.
255 /// Also note that in a panelview or similar this only works on the focused item
256 /// <p><hr>
257 /// @skinning_v17 **[New Boolean Condition]** \link String_Contains `String.Contains(info\,substring)`\endlink
258 /// <p>
259 /// }
260 /// \table_end
262 /// -----------------------------------------------------------------------------
265 const infomap string_bools[] = {{ "isempty", STRING_IS_EMPTY },
266 { "isequal", STRING_IS_EQUAL },
267 { "startswith", STRING_STARTS_WITH },
268 { "endswith", STRING_ENDS_WITH },
269 { "contains", STRING_CONTAINS }};
271 /// \page modules__infolabels_boolean_conditions
272 /// \subsection modules__infolabels_boolean_conditions_Integer Integer
273 /// \table_start
274 /// \table_h3{ Labels, Type, Description }
275 /// \table_row3{ <b>`Integer.ValueOf(number)`</b>,
276 /// \anchor Integer_ValueOf
277 /// _integer_,
278 /// @return An integer info label that represents the provided number
279 /// @param number - the number to compute
280 /// @note **Example:** `Integer.ValueOf(4)` will be evaluated to 4.
281 /// @note Will return -1 if not able to convert the provided value to an integer. **Example**: `Integer.ValueOf(some string)` will evaluate to -1
282 /// as the provided argument is not an integer.
283 /// <p><hr>
284 /// @skinning_v20 **[New InfoLabel]** \link Integer_ValueOf `Integer.ValueOf(number)`\endlink
285 /// <p>
286 /// }
287 /// \table_row3{ <b>`Integer.IsEqual(info\,number)`</b>,
288 /// \anchor Integer_IsEqual
289 /// _boolean_,
290 /// @return **True** if the value of the infolabel is equal to the supplied number.
291 /// @param info - infolabel
292 /// @param number - number or integer infolabel to compare
293 /// @note **Example:** `Integer.IsEqual(ListItem.Year\,2000)`
294 /// <p><hr>
295 /// @skinning_v17 **[New Boolean Condition]** \link Integer_IsEqual `Integer.IsEqual(info\,number)`\endlink
296 /// @skinning_v20 \link Integer_IsEqual `Integer.IsEqual(info\,number)`\endlink now supports comparisons against other integer infos
297 /// and not just fixed number values.
298 /// <p>
299 /// }
300 /// \table_row3{ <b>`Integer.IsGreater(info\,number)`</b>,
301 /// \anchor Integer_IsGreater
302 /// _boolean_,
303 /// @return **True** if the value of the infolabel is greater than to the supplied number.
304 /// @param info - infolabel
305 /// @param number - number or integer infolabel to compare
306 /// @note **Example:** `Integer.IsGreater(ListItem.Year\,2000)`
307 /// <p><hr>
308 /// @skinning_v17 **[New Boolean Condition]** \link Integer_IsGreater `Integer.IsGreater(info\,number)`\endlink
309 /// @skinning_v20 \link Integer_IsGreater `Integer.IsGreater(info\,number)`\endlink now supports comparisons against other integer infos
310 /// and not just fixed number values.
311 /// <p>
312 /// }
313 /// \table_row3{ <b>`Integer.IsGreaterOrEqual(info\,number)`</b>,
314 /// \anchor Integer_IsGreaterOrEqual
315 /// _boolean_,
316 /// @return **True** if the value of the infolabel is greater or equal to the supplied number.
317 /// @param info - infolabel
318 /// @param number - number or integer infolabel to compare
319 /// @note **Example:** `Integer.IsGreaterOrEqual(ListItem.Year\,2000)`
320 /// @note **Example2:** `Integer.IsGreaterOrEqual(Container(x).ListItem(1).Year\,Container(x).ListItem(2).Year)`
321 /// <p><hr>
322 /// @skinning_v17 **[New Boolean Condition]** \link Integer_IsGreaterOrEqual `Integer.IsGreaterOrEqual(info\,number)`\endlink
323 /// @skinning_v20 \link Integer_IsGreaterOrEqual `Integer.IsGreaterOrEqual(info\,number)`\endlink now supports comparisons against other integer infos
324 /// and not just fixed number values.
325 /// <p>
326 /// }
327 /// \table_row3{ <b>`Integer.IsLess(info\,number)`</b>,
328 /// \anchor Integer_IsLess
329 /// _boolean_,
330 /// @return **True** if the value of the infolabel is less than the supplied number.
331 /// @param info - infolabel
332 /// @param number - number or integer infolabel to compare
333 /// @note **Example:** `Integer.IsLess(ListItem.Year\,2000)`
334 /// <p><hr>
335 /// @skinning_v17 **[New Boolean Condition]** \link Integer_IsLess `Integer.IsLess(info\,number)`\endlink
336 /// @skinning_v20 \link Integer_IsLess `Integer.IsLess(info\,number)`\endlink now supports comparisons against other integer infos
337 /// and not just fixed number values.
338 /// <p>
339 /// }
340 /// \table_row3{ <b>`Integer.IsLessOrEqual(info\,number)`</b>,
341 /// \anchor Integer_IsLessOrEqual
342 /// _boolean_,
343 /// @return **True** if the value of the infolabel is less or equal to the supplied number.
344 /// @param info - infolabel
345 /// @param number - number or integer infolabel to compare
346 /// @note **Example:** `Integer.IsLessOrEqual(ListItem.Year\,2000)`
347 /// <p><hr>
348 /// @skinning_v17 **[New Boolean Condition]** \link Integer_IsLessOrEqual `Integer.IsLessOrEqual(info\,number)`\endlink
349 /// @skinning_v20 \link Integer_IsLessOrEqual `Integer.IsLessOrEqual(info\,number)`\endlink now supports comparisons against other integer infos
350 /// and not just fixed number values.
351 /// <p>
352 /// }
353 /// \table_row3{ <b>`Integer.IsEven(info)`</b>,
354 /// \anchor Integer_IsEven
355 /// _boolean_,
356 /// @return **True** if the value of the infolabel is odd
357 /// @param info - infolabel
358 /// @note **Example:** `Integer.IsEven(ListItem.CurrentItem)`
359 /// <p><hr>
360 /// @skinning_v19 **[New Boolean Condition]** \link Integer_IsEven `Integer.IsEven(info)`\endlink
361 /// <p>
362 /// }
363 /// \table_row3{ <b>`Integer.IsOdd(info)`</b>,
364 /// \anchor Integer_IsOdd
365 /// _boolean_,
366 /// @return **True** if the value of the infolabel is odd
367 /// @param info - infolabel
368 /// @note **Example:** `Integer.IsOdd(ListItem.CurrentItem)`
369 /// <p><hr>
370 /// @skinning_v19 **[New Boolean Condition]** \link Integer_IsOdd `Integer.IsOdd(info)`\endlink
371 /// <p>
372 /// }
373 /// \table_end
375 /// -----------------------------------------------------------------------------
377 const infomap integer_bools[] = {{ "isequal", INTEGER_IS_EQUAL },
378 { "isgreater", INTEGER_GREATER_THAN },
379 { "isgreaterorequal", INTEGER_GREATER_OR_EQUAL },
380 { "isless", INTEGER_LESS_THAN },
381 { "islessorequal", INTEGER_LESS_OR_EQUAL },
382 { "iseven", INTEGER_EVEN },
383 { "isodd", INTEGER_ODD }};
385 /// \page modules__infolabels_boolean_conditions
386 /// \subsection modules__infolabels_boolean_conditions_Player Player
387 /// \table_start
388 /// \table_h3{ Labels, Type, Description }
389 /// \table_row3{ <b>`Player.HasAudio`</b>,
390 /// \anchor Player_HasAudio
391 /// _boolean_,
392 /// @return **True** if the player has an audio file.
393 /// <p>
394 /// }
395 /// \table_row3{ <b>`Player.HasGame`</b>,
396 /// \anchor Player_HasGame
397 /// _boolean_,
398 /// @return **True** if the player has a game file (RETROPLAYER).
399 /// <p><hr>
400 /// @skinning_v18 **[New Boolean Condition]** \link Player_HasGame `Player.HasGame`\endlink
401 /// <p>
402 /// }
403 /// \table_row3{ <b>`Player.HasMedia`</b>,
404 /// \anchor Player_HasMedia
405 /// _boolean_,
406 /// @return **True** if the player has an audio or video file.
407 /// <p>
408 /// }
409 /// \table_row3{ <b>`Player.HasVideo`</b>,
410 /// \anchor Player_HasVideo
411 /// _boolean_,
412 /// @return **True** if the player has a video file.
413 /// <p>
414 /// }
415 /// \table_row3{ <b>`Player.Paused`</b>,
416 /// \anchor Player_Paused
417 /// _boolean_,
418 /// @return **True** if the player is paused.
419 /// <p>
420 /// }
421 /// \table_row3{ <b>`Player.Playing`</b>,
422 /// \anchor Player_Playing
423 /// _boolean_,
424 /// @return **True** if the player is currently playing (i.e. not ffwding\,
425 /// rewinding or paused.)
426 /// <p>
427 /// }
428 /// \table_row3{ <b>`Player.Rewinding`</b>,
429 /// \anchor Player_Rewinding
430 /// _boolean_,
431 /// @return **True** if the player is rewinding.
432 /// <p>
433 /// }
434 /// \table_row3{ <b>`Player.Rewinding2x`</b>,
435 /// \anchor Player_Rewinding2x
436 /// _boolean_,
437 /// @return **True** if the player is rewinding at 2x.
438 /// <p>
439 /// }
440 /// \table_row3{ <b>`Player.Rewinding4x`</b>,
441 /// \anchor Player_Rewinding4x
442 /// _boolean_,
443 /// @return **True** if the player is rewinding at 4x.
444 /// <p>
445 /// }
446 /// \table_row3{ <b>`Player.Rewinding8x`</b>,
447 /// \anchor Player_Rewinding8x
448 /// _boolean_,
449 /// @return **True** if the player is rewinding at 8x.
450 /// <p>
451 /// }
452 /// \table_row3{ <b>`Player.Rewinding16x`</b>,
453 /// \anchor Player_Rewinding16x
454 /// _boolean_,
455 /// @return **True** if the player is rewinding at 16x.
456 /// <p>
457 /// }
458 /// \table_row3{ <b>`Player.Rewinding32x`</b>,
459 /// \anchor Player_Rewinding32x
460 /// _boolean_,
461 /// @return **True** if the player is rewinding at 32x.
462 /// <p>
463 /// }
464 /// \table_row3{ <b>`Player.Forwarding`</b>,
465 /// \anchor Player_Forwarding
466 /// _boolean_,
467 /// @return **True** if the player is fast forwarding.
468 /// <p>
469 /// }
470 /// \table_row3{ <b>`Player.Forwarding2x`</b>,
471 /// \anchor Player_Forwarding2x
472 /// _boolean_,
473 /// @return **True** if the player is fast forwarding at 2x.
474 /// <p>
475 /// }
476 /// \table_row3{ <b>`Player.Forwarding4x`</b>,
477 /// \anchor Player_Forwarding4x
478 /// _boolean_,
479 /// @return **True** if the player is fast forwarding at 4x.
480 /// <p>
481 /// }
482 /// \table_row3{ <b>`Player.Forwarding8x`</b>,
483 /// \anchor Player_Forwarding8x
484 /// _boolean_,
485 /// @return **True** if the player is fast forwarding at 8x.
486 /// <p>
487 /// }
488 /// \table_row3{ <b>`Player.Forwarding16x`</b>,
489 /// \anchor Player_Forwarding16x
490 /// _boolean_,
491 /// @return **True** if the player is fast forwarding at 16x.
492 /// <p>
493 /// }
494 /// \table_row3{ <b>`Player.Forwarding32x`</b>,
495 /// \anchor Player_Forwarding32x
496 /// _boolean_,
497 /// @return **True** if the player is fast forwarding at 32x.
498 /// <p>
499 /// }
500 /// \table_row3{ <b>`Player.Caching`</b>,
501 /// \anchor Player_Caching
502 /// _boolean_,
503 /// @return **True** if the player is current re-caching data (internet based
504 /// video playback).
505 /// <p>
506 /// }
507 /// \table_row3{ <b>`Player.DisplayAfterSeek`</b>,
508 /// \anchor Player_DisplayAfterSeek
509 /// _boolean_,
510 /// @return **True** for the first 2.5 seconds after a seek.
511 /// <p>
512 /// }
513 /// \table_row3{ <b>`Player.Seekbar`</b>,
514 /// \anchor Player_Seekbar
515 /// _integer_,
516 /// @return The percentage of one seek to other position.
517 /// <p>
518 /// }
519 /// \table_row3{ <b>`Player.Seeking`</b>,
520 /// \anchor Player_Seeking
521 /// _boolean_,
522 /// @return **True** if a seek is in progress.
523 /// <p>
524 /// }
525 /// \table_row3{ <b>`Player.ShowTime`</b>,
526 /// \anchor Player_ShowTime
527 /// _boolean_,
528 /// @return **True** if the user has requested the time to show (occurs in video
529 /// fullscreen).
530 /// <p>
531 /// }
532 /// \table_row3{ <b>`Player.ShowInfo`</b>,
533 /// \anchor Player_ShowInfo
534 /// _boolean_,
535 /// @return **True** if the user has requested the song info to show (occurs in
536 /// visualisation fullscreen and slideshow).
537 /// <p>
538 /// }
539 /// \table_row3{ <b>`Player.Title`</b>,
540 /// \anchor Player_Title
541 /// _string_,
542 /// @return The Musicplayer title for audio and the Videoplayer title for
543 /// video.
544 /// <p>
545 /// }
546 /// \table_row3{ <b>`Player.offset(number).Title`</b>,
547 /// \anchor Player_Offset_Title
548 /// _string_,
549 /// @return The title of audio or video which has an offset `number` with respect to the currently playing item.
550 /// <p><hr>
551 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Title `Player.offset(number).Title`\endlink
552 /// <p>
553 /// }
554 /// \table_row3{ <b>`Player.position(number).Title`</b>,
555 /// \anchor Player_Position_Title
556 /// _string_,
557 /// @return The title of the audio or video which has an offset `number` with respect to the start of the playlist.
558 /// <p><hr>
559 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Title `Player.position(number).Title`\endlink
560 /// <p>
561 /// }
562 /// \table_row3{ <b>`Player.Muted`</b>,
563 /// \anchor Player_Muted
564 /// _boolean_,
565 /// @return **True** if the volume is muted.
566 /// <p>
567 /// }
568 /// \table_row3{ <b>`Player.HasDuration`</b>,
569 /// \anchor Player_HasDuration
570 /// _boolean_,
571 /// @return **True** if Media is not a true stream.
572 /// <p>
573 /// }
574 /// \table_row3{ <b>`Player.Passthrough`</b>,
575 /// \anchor Player_Passthrough
576 /// _boolean_,
577 /// @return **True** if the player is using audio passthrough.
578 /// <p>
579 /// }
580 /// \table_row3{ <b>`Player.CacheLevel`</b>,
581 /// \anchor Player_CacheLevel
582 /// _string_,
583 /// @return The used cache level as a string with an integer number.
584 /// <p>
585 /// }
586 /// \table_row3{ <b>`Player.Progress`</b>,
587 /// \anchor Player_Progress
588 /// _integer_ / _string_,
589 /// @return The progress position as percentage.
590 /// <p><hr>
591 /// @skinning_v19 \link Player_Progress `Player.Progress`\endlink infolabel
592 /// also exposed as a string.
593 /// <p>
594 /// }
595 /// \table_row3{ <b>`Player.ProgressCache`</b>,
596 /// \anchor Player_ProgressCache
597 /// _integer_ / _string_,
598 /// @return How much of the file is cached above current play percentage
599 /// <p><hr>
600 /// @skinning_v19 \link Player_ProgressCache `Player.ProgressCache`\endlink
601 /// infolabel also exposed as a string.
602 /// <p>
603 /// }
604 /// \table_row3{ <b>`Player.Volume`</b>,
605 /// \anchor Player_Volume
606 /// _string_,
607 /// @return The current player volume with the format `%2.1f` dB
608 /// <p>
609 /// }
610 /// \table_row3{ <b>`Player.SubtitleDelay`</b>,
611 /// \anchor Player_SubtitleDelay
612 /// _string_,
613 /// @return The used subtitle delay with the format `%2.3f` s
614 /// <p>
615 /// }
616 /// \table_row3{ <b>`Player.AudioDelay`</b>,
617 /// \anchor Player_AudioDelay
618 /// _string_,
619 /// @return The used audio delay with the format `%2.3f` s
620 /// <p>
621 /// }
622 /// \table_row3{ <b>`Player.Chapter`</b>,
623 /// \anchor Player_Chapter
624 /// _integer_,
625 /// @return The current chapter of current playing media.
626 /// <p>
627 /// }
628 /// \table_row3{ <b>`Player.ChapterCount`</b>,
629 /// \anchor Player_ChapterCount
630 /// _integer_,
631 /// @return The total number of chapters of current playing media.
632 /// <p>
633 /// }
634 /// \table_row3{ <b>`Player.ChapterName`</b>,
635 /// \anchor Player_ChapterName
636 /// _string_,
637 /// @return The name of currently used chapter if available.
638 /// <p>
639 /// }
640 /// \table_row3{ <b>`Player.Folderpath`</b>,
641 /// \anchor Player_Folderpath
642 /// _string_,
643 /// @return The full path of the currently playing song or movie
644 /// <p>
645 /// }
646 /// \table_row3{ <b>`Player.offset(number).Folderpath`</b>,
647 /// \anchor Player_Offset_Folderpath
648 /// _string_,
649 /// @return The full path of the audio or video file which has an offset `number` with respect to the currently playing item.
650 /// <p><hr>
651 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Folderpath `Player.offset(number).Folderpath`\endlink
652 /// <p>
653 /// }
654 /// \table_row3{ <b>`Player.position(number).Folderpath`</b>,
655 /// \anchor Player_Position_Folderpath
656 /// _string_,
657 /// @return The full path of the audio or video file which has an offset `number` with respect to the start of the playlist.
658 /// <p><hr>
659 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Folderpath `Player.position(number).Folderpath`\endlink
660 /// <p>
661 /// }
662 /// \table_row3{ <b>`Player.FilenameAndPath`</b>,
663 /// \anchor Player_FilenameAndPath
664 /// _string_,
665 /// @return The full path with filename of the currently
666 /// playing song or movie
667 /// <p>
668 /// }
669 /// \table_row3{ <b>`Player.offset(number).FilenameAndPath`</b>,
670 /// \anchor Player_Offset_FilenameAndPath
671 /// _string_,
672 /// @return The full path with filename of audio or video file which has an offset `number` with respect to the currently playing item.
673 /// <p><hr>
674 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_FilenameAndPath `Player.offset(number).FilenameAndPath`\endlink
675 /// <p>
676 /// }
677 /// \table_row3{ <b>`Player.position(number).FilenameAndPath`</b>,
678 /// \anchor Player_Position_FilenameAndPath
679 /// _string_,
680 /// @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.
681 /// <p><hr>
682 /// @skinning_v19 **[New Infolabel]** \link Player_Position_FilenameAndPath `Player.position(number).FilenameAndPath`\endlink
683 /// <p>
684 /// }
685 /// \table_row3{ <b>`Player.Filename`</b>,
686 /// \anchor Player_Filename
687 /// _string_,
688 /// @return The filename of the currently playing media.
689 /// <p><hr>
690 /// @skinning_v13 **[New Infolabel]** \link Player_Filename `Player.Filename`\endlink
691 /// <p>
692 /// }
693 /// \table_row3{ <b>`Player.offset(number).Filename`</b>,
694 /// \anchor Player_Offset_Filename
695 /// _string_,
696 /// @return The filename of audio or video file which has an offset `number` with respect to the currently playing item.
697 /// <p><hr>
698 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Filename `Player.offset(number).Filename`\endlink
699 /// <p>
700 /// }
701 /// \table_row3{ <b>`Player.position(number).Filename`</b>,
702 /// \anchor Player_Position_Filename
703 /// _string_,
704 /// @return The filename of the audio or video file which has an offset `number` with respect to the start of the playlist.
705 /// <p><hr>
706 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Filename `Player.position(number).Filename`\endlink
707 /// <p>
708 /// }
709 /// \table_row3{ <b>`Player.IsInternetStream`</b>,
710 /// \anchor Player_IsInternetStream
711 /// _boolean_,
712 /// @return **True** if the player is playing an internet stream.
713 /// <p>
714 /// }
715 /// \table_row3{ <b>`Player.PauseEnabled`</b>,
716 /// \anchor Player_PauseEnabled
717 /// _boolean_,
718 /// @return **True** if played stream is paused.
719 /// <p>
720 /// }
721 /// \table_row3{ <b>`Player.SeekEnabled`</b>,
722 /// \anchor Player_SeekEnabled
723 /// _boolean_,
724 /// @return **True** if seek on playing is enabled.
725 /// <p>
726 /// }
727 /// \table_row3{ <b>`Player.ChannelPreviewActive`</b>,
728 /// \anchor Player_ChannelPreviewActive
729 /// _boolean_,
730 /// @return **True** if PVR channel preview is active (used
731 /// channel tag different from played tag)
732 /// <p>
733 /// }
734 /// \table_row3{ <b>`Player.TempoEnabled`</b>,
735 /// \anchor Player_TempoEnabled
736 /// _boolean_,
737 /// @return **True** if player supports tempo (i.e. speed up/down normal
738 /// playback speed)
739 /// <p><hr>
740 /// @skinning_v17 **[New Boolean Condition]** \link Player_TempoEnabled `Player.TempoEnabled`\endlink
741 /// <p>
742 /// }
743 /// \table_row3{ <b>`Player.IsTempo`</b>,
744 /// \anchor Player_IsTempo
745 /// _boolean_,
746 /// @return **True** if player has tempo (i.e. is playing with a playback speed higher or
747 /// lower than normal playback speed)
748 /// <p><hr>
749 /// @skinning_v17 **[New Boolean Condition]** \link Player_IsTempo `Player.IsTempo`\endlink
750 /// <p>
751 /// }
752 /// \table_row3{ <b>`Player.PlaySpeed`</b>,
753 /// \anchor Player_PlaySpeed
754 /// _string_,
755 /// @return The player playback speed with the format `%1.2f` (1.00 means normal
756 /// playback speed).
757 /// @note For Tempo\, the default range is 0.80 - 1.50 (it can be changed
758 /// in advanced settings). If \ref Player_PlaySpeed "Player.PlaySpeed" returns a value different from 1.00
759 /// and \ref Player_IsTempo "Player.IsTempo" is false it means the player is in ff/rw mode.
760 /// <p>
761 /// }
762 /// \table_row3{ <b>`Player.HasResolutions`</b>,
763 /// \anchor Player_HasResolutions
764 /// _boolean_,
765 /// @return **True** if the player is allowed to switch resolution and refresh rate
766 /// (i.e. if whitelist modes are configured in Kodi's System/Display settings)
767 /// <p><hr>
768 /// @skinning_v18 **[New Boolean Condition]** \link Player_HasResolutions `Player.HasResolutions`\endlink
769 /// <p>
770 /// }
771 /// \table_row3{ <b>`Player.HasPrograms`</b>,
772 /// \anchor Player_HasPrograms
773 /// _boolean_,
774 /// @return **True** if the media file being played has programs\, i.e. groups of streams.
775 /// @note Ex: if a media file has multiple streams (quality\, channels\, etc) a program represents
776 /// a particular stream combo.
777 /// <p>
778 /// }
779 /// \table_row3{ <b>`Player.FrameAdvance`</b>,
780 /// \anchor Player_FrameAdvance
781 /// _boolean_,
782 /// @return **True** if player is in frame advance mode.
783 /// @note Skins should hide seek bar in this mode
784 /// <p><hr>
785 /// @skinning_v18 **[New Boolean Condition]** \link Player_FrameAdvance `Player.FrameAdvance`\endlink
786 /// <p>
787 /// }
788 /// \table_row3{ <b>`Player.Icon`</b>,
789 /// \anchor Player_Icon
790 /// _string_,
791 /// @return The thumbnail of the currently playing item. If no thumbnail image exists\,
792 /// the icon will be returned\, if available.
793 /// <p><hr>
794 /// @skinning_v18 **[New Infolabel]** \link Player_Icon `Player.Icon`\endlink
795 /// <p>
796 /// }
797 /// \table_row3{ <b>`Player.Editlist`</b>,
798 /// \anchor Player_Editlist
799 /// _string_,
800 /// @return The editlist of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
801 /// Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
802 /// @note This infolabel does not contain EDL cuts. Edits start and end times are ajusted according to cuts
803 /// defined for the media item.
804 /// <p><hr>
805 /// @skinning_v20 **[New Infolabel]** \link Player_Editlist `Player.Editlist`\endlink
806 /// <p>
807 /// }
808 /// \table_row3{ <b>`Player.Cuts`</b>,
809 /// \anchor Player_Cuts
810 /// _string_,
811 /// @return The EDL cut markers of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
812 /// Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
813 /// <p><hr>
814 /// @skinning_v20 **[New Infolabel]** \link Player_Cuts `Player.Cuts`\endlink
815 /// <p>
816 /// }
817 /// \table_row3{ <b>`Player.SceneMarkers`</b>,
818 /// \anchor Player_SceneMarkers
819 /// _string_,
820 /// @return The EDL scene markers of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
821 /// Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
822 /// <p><hr>
823 /// @skinning_v20 **[New Infolabel]** \link Player_SceneMarkers `Player.SceneMarkers`\endlink
824 /// <p>
825 /// }
826 /// \table_row3{ <b>`Player.HasSceneMarkers`</b>,
827 /// \anchor Player_HasSceneMarkers
828 /// _boolean_,
829 /// @return **True** if the item being played has scene markers\, **False** otherwise
830 /// <p><hr>
831 /// @skinning_v20 **[New Infolabel]** \link Player_HasSceneMarkers `Player.HasSceneMarkers`\endlink
832 /// <p>
833 /// }
834 /// \table_row3{ <b>`Player.Chapters`</b>,
835 /// \anchor Player_Chapters
836 /// _string_,
837 /// @return The chapters of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
838 /// Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
839 /// <p><hr>
840 /// @skinning_v19 **[New Infolabel]** \link Player_Chapters `Player.Chapters`\endlink
841 /// <p>
842 /// }
843 /// \table_row3{ <b>`Player.IsExternal`</b>,
844 /// \anchor Player_IsExternal
845 /// _boolean_,
846 /// @return **True** if the playing player is an external player\, **False** otherwise
847 /// <p><hr>
848 /// @skinning_v21 **[New Boolean Condition]** \link Player_IsExternal `Player.IsExternal`\endlink
849 /// <p>
850 /// }
851 /// \table_row3{ <b>`Player.IsRemote`</b>,
852 /// \anchor Player_IsRemote
853 /// _boolean_,
854 /// @return **True** if the playing player is a remote player (e.g. UPnP)\, **False** otherwise
855 /// <p><hr>
856 /// @skinning_v21 **[New Boolean Condition]** \link Player_IsRemote `Player.IsRemote`\endlink
857 /// <p>
858 /// }
859 const infomap player_labels[] = {{"hasmedia", PLAYER_HAS_MEDIA},
860 {"hasaudio", PLAYER_HAS_AUDIO},
861 {"hasvideo", PLAYER_HAS_VIDEO},
862 {"hasgame", PLAYER_HAS_GAME},
863 {"isexternal", PLAYER_IS_EXTERNAL},
864 {"isremote", PLAYER_IS_REMOTE},
865 {"playing", PLAYER_PLAYING},
866 {"paused", PLAYER_PAUSED},
867 {"rewinding", PLAYER_REWINDING},
868 {"forwarding", PLAYER_FORWARDING},
869 {"rewinding2x", PLAYER_REWINDING_2x},
870 {"rewinding4x", PLAYER_REWINDING_4x},
871 {"rewinding8x", PLAYER_REWINDING_8x},
872 {"rewinding16x", PLAYER_REWINDING_16x},
873 {"rewinding32x", PLAYER_REWINDING_32x},
874 {"forwarding2x", PLAYER_FORWARDING_2x},
875 {"forwarding4x", PLAYER_FORWARDING_4x},
876 {"forwarding8x", PLAYER_FORWARDING_8x},
877 {"forwarding16x", PLAYER_FORWARDING_16x},
878 {"forwarding32x", PLAYER_FORWARDING_32x},
879 {"caching", PLAYER_CACHING},
880 {"seekbar", PLAYER_SEEKBAR},
881 {"seeking", PLAYER_SEEKING},
882 {"showtime", PLAYER_SHOWTIME},
883 {"showinfo", PLAYER_SHOWINFO},
884 {"muted", PLAYER_MUTED},
885 {"hasduration", PLAYER_HASDURATION},
886 {"passthrough", PLAYER_PASSTHROUGH},
887 {"cachelevel", PLAYER_CACHELEVEL},
888 {"title", PLAYER_TITLE},
889 {"progress", PLAYER_PROGRESS},
890 {"progresscache", PLAYER_PROGRESS_CACHE},
891 {"volume", PLAYER_VOLUME},
892 {"subtitledelay", PLAYER_SUBTITLE_DELAY},
893 {"audiodelay", PLAYER_AUDIO_DELAY},
894 {"chapter", PLAYER_CHAPTER},
895 {"chaptercount", PLAYER_CHAPTERCOUNT},
896 {"chaptername", PLAYER_CHAPTERNAME},
897 {"folderpath", PLAYER_PATH},
898 {"filenameandpath", PLAYER_FILEPATH},
899 {"filename", PLAYER_FILENAME},
900 {"isinternetstream", PLAYER_ISINTERNETSTREAM},
901 {"pauseenabled", PLAYER_CAN_PAUSE},
902 {"seekenabled", PLAYER_CAN_SEEK},
903 {"channelpreviewactive", PLAYER_IS_CHANNEL_PREVIEW_ACTIVE},
904 {"tempoenabled", PLAYER_SUPPORTS_TEMPO},
905 {"istempo", PLAYER_IS_TEMPO},
906 {"playspeed", PLAYER_PLAYSPEED},
907 {"hasprograms", PLAYER_HAS_PROGRAMS},
908 {"hasresolutions", PLAYER_HAS_RESOLUTIONS},
909 {"frameadvance", PLAYER_FRAMEADVANCE},
910 {"icon", PLAYER_ICON},
911 {"editlist", PLAYER_EDITLIST},
912 {"cuts", PLAYER_CUTS},
913 {"scenemarkers", PLAYER_SCENE_MARKERS},
914 {"hasscenemarkers", PLAYER_HAS_SCENE_MARKERS},
915 {"chapters", PLAYER_CHAPTERS}};
917 /// \page modules__infolabels_boolean_conditions
918 /// \table_row3{ <b>`Player.Art(type)`</b>,
919 /// \anchor Player_Art_type
920 /// _string_,
921 /// @return The Image for the defined art type for the current playing ListItem.
922 /// @param type - The art type. The type is defined by scripts and scrappers and can have any value.
923 /// Common example values for type are:
924 /// - fanart
925 /// - thumb
926 /// - poster
927 /// - banner
928 /// - clearlogo
929 /// - tvshow.poster
930 /// - tvshow.banner
931 /// - etc
932 /// @todo get a way of centralize all random art strings used in core so we can point users to them
933 /// while still making it clear they can have any value.
934 /// <p>
935 /// }
936 /// \table_row3{ <b>`Player.HasPerformedSeek(interval)`</b>,
937 /// \anchor Player_HasPerformedSeek
938 /// _boolean_,
939 /// @return **True** if the Player has performed a seek operation in the last provided second `interval`\, **False** otherwise.
940 /// @param interval - the time interval (in seconds)
941 /// <p><hr>
942 /// @skinning_v20 **[New Boolean Condition]** \link Player_HasPerformedSeek `Player.HasPerformedSeek(interval)`\endlink
943 /// <p>
944 /// }
946 const infomap player_param[] = {{"art", PLAYER_ITEM_ART},
947 {"hasperformedseek", PLAYER_HASPERFORMEDSEEK}};
949 /// \page modules__infolabels_boolean_conditions
950 /// \table_row3{ <b>`Player.SeekTime`</b>,
951 /// \anchor Player_SeekTime
952 /// _string_,
953 /// @return The time to which the user is seeking.
954 /// <p>
955 /// }
956 /// \table_row3{ <b>`Player.SeekOffset([format])`</b>,
957 /// \anchor Player_SeekOffset_format
958 /// _string_,
959 /// @return The seek offset after a seek press in a given format.
960 /// @param format [opt] The format of the return time value.
961 /// See \ref TIME_FORMAT for the list of possible values.
962 /// <p>
963 /// @note **Example:** user presses BigStepForward\, player.seekoffset returns +10:00
964 /// <p>
965 /// }
966 /// \table_row3{ <b>`Player.SeekStepSize`</b>,
967 /// \anchor Player_SeekStepSize
968 /// _string_,
969 /// @return The seek step size.
970 /// <p>
971 /// <hr>
972 /// @skinning_v15 **[New Infolabel]** \link Player_SeekStepSize `Player.SeekStepSize`\endlink
973 /// <p>
974 /// }
975 /// \table_row3{ <b>`Player.TimeRemaining([format])`</b>,
976 /// \anchor Player_TimeRemaining_format
977 /// _string_,
978 /// @return The remaining time of current playing media in a given format.
979 /// @param format [opt] The format of the return time value.
980 /// See \ref TIME_FORMAT for the list of possible values.
981 /// <p>
982 /// }
983 /// \table_row3{ <b>`Player.TimeSpeed`</b>,
984 /// \anchor Player_TimeSpeed
985 /// _string_,
986 /// @return The time and the playspeed formatted: "1:23 (2x)".
987 /// <p>
988 /// }
989 /// \table_row3{ <b>`Player.Time([format])`</b>,
990 /// \anchor Player_Time_format
991 /// _string_,
992 /// @return The elapsed time of current playing media in a given format.
993 /// @param format [opt] The format of the return time value.
994 /// See \ref TIME_FORMAT for the list of possible values.
995 /// <p>
996 /// }
997 /// \table_row3{ <b>`Player.Duration([format])`</b>,
998 /// \anchor Player_Duration_format
999 /// _string_,
1000 /// @return The total duration of the current playing media in a given format.
1001 /// @param format [opt] The format of the return time value.
1002 /// See \ref TIME_FORMAT for the list of possible values.
1003 /// <p>
1004 /// }
1005 /// \table_row3{ <b>`Player.FinishTime([format])`</b>,
1006 /// \anchor Player_FinishTime_format
1007 /// _string_,
1008 /// @return The time at which the playing media will end (in a specified format).
1009 /// @param format [opt] The format of the return time value.
1010 /// See \ref TIME_FORMAT for the list of possible values.
1011 /// <p>
1012 /// }
1013 /// \table_row3{ <b>`Player.StartTime([format])`</b>,
1014 /// \anchor Player_StartTime_format
1015 /// _string_,
1016 /// @return The time at which the playing media began (in a specified format).
1017 /// @param format [opt] The format of the return time value.
1018 /// See \ref TIME_FORMAT for the list of possible values.
1019 /// <p>
1020 /// }
1021 /// \table_row3{ <b>`Player.SeekNumeric([format])`</b>,
1022 /// \anchor Player_SeekNumeric_format
1023 /// _string_,
1024 /// @return The time at which the playing media began (in a specified format).
1025 /// @param format [opt] The format of the return time value.
1026 /// See \ref TIME_FORMAT for the list of possible values.
1027 /// <p>
1028 /// }
1029 const infomap player_times[] = {{ "seektime", PLAYER_SEEKTIME },
1030 { "seekoffset", PLAYER_SEEKOFFSET },
1031 { "seekstepsize", PLAYER_SEEKSTEPSIZE },
1032 { "timeremaining", PLAYER_TIME_REMAINING },
1033 { "timespeed", PLAYER_TIME_SPEED },
1034 { "time", PLAYER_TIME },
1035 { "duration", PLAYER_DURATION },
1036 { "finishtime", PLAYER_FINISH_TIME },
1037 { "starttime", PLAYER_START_TIME },
1038 { "seeknumeric", PLAYER_SEEKNUMERIC } };
1041 /// \page modules__infolabels_boolean_conditions
1042 /// \table_row3{ <b>`Player.Process(videohwdecoder)`</b>,
1043 /// \anchor Player_Process_videohwdecoder
1044 /// _boolean_,
1045 /// @return **True** if the currently playing video is decoded in hardware.
1046 /// <p><hr>
1047 /// @skinning_v17 **[New Boolean Condition]** \link Player_Process_videohwdecoder `Player.Process(videohwdecoder)`\endlink
1048 /// <p>
1049 /// }
1050 /// \table_row3{ <b>`Player.Process(videodecoder)`</b>,
1051 /// \anchor Player_Process_videodecoder
1052 /// _string_,
1053 /// @return The videodecoder name of the currently playing video.
1054 /// <p><hr>
1055 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodecoder `Player.Process(videodecoder)`\endlink
1056 /// <p>
1057 /// }
1058 /// \table_row3{ <b>`Player.Process(deintmethod)`</b>,
1059 /// \anchor Player_Process_deintmethod
1060 /// _string_,
1061 /// @return The deinterlace method of the currently playing video.
1062 /// <p><hr>
1063 /// @skinning_v17 **[New Infolabel]** \link Player_Process_deintmethod `Player.Process(deintmethod)`\endlink
1064 /// <p>
1065 /// }
1066 /// \table_row3{ <b>`Player.Process(pixformat)`</b>,
1067 /// \anchor Player_Process_pixformat
1068 /// _string_,
1069 /// @return The pixel format of the currently playing video.
1070 /// <p><hr>
1071 /// @skinning_v17 **[New Infolabel]** \link Player_Process_pixformat `Player.Process(pixformat)`\endlink
1072 /// <p>
1073 /// }
1074 /// \table_row3{ <b>`Player.Process(videowidth)`</b>,
1075 /// \anchor Player_Process_videowidth
1076 /// _string_,
1077 /// @return The width of the currently playing video.
1078 /// <p><hr>
1079 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videowidth `Player.Process(videowidth)`\endlink
1080 /// <p>
1081 /// }
1082 /// \table_row3{ <b>`Player.Process(videoheight)`</b>,
1083 /// \anchor Player_Process_videoheight
1084 /// _string_,
1085 /// @return The width of the currently playing video.
1086 /// <p><hr>
1087 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videoheight `Player.Process(videoheight)`\endlink
1088 /// <p>
1089 /// }
1090 /// \table_row3{ <b>`Player.Process(videoscantype)`</b>,
1091 /// \anchor Player_Process_videoscantype
1092 /// _string_,
1093 /// @return The scan type identifier of the currently playing video **p** (for progressive) or **i** (for interlaced).
1094 /// <p><hr>
1095 /// @skinning_v20 **[New Infolabel]** \link Player_Process_videoscantype `Player.Process(videoscantype)`\endlink
1096 /// <p>
1097 /// }
1098 /// \table_row3{ <b>`Player.Process(videofps)`</b>,
1099 /// \anchor Player_Process_videofps
1100 /// _string_,
1101 /// @return The video framerate of the currently playing video.
1102 /// <p><hr>
1103 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videofps `Player.Process(videofps)`\endlink
1104 /// <p>
1105 /// }
1106 /// \table_row3{ <b>`Player.Process(videodar)`</b>,
1107 /// \anchor Player_Process_videodar
1108 /// _string_,
1109 /// @return The display aspect ratio of the currently playing video.
1110 /// <p><hr>
1111 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(videodar)`\endlink
1112 /// <p>
1113 /// }
1114 /// \table_row3{ <b>`Player.Process(audiodecoder)`</b>,
1115 /// \anchor Player_Process_audiodecoder
1116 /// _string_,
1117 /// @return The audiodecoder name of the currently playing item.
1118 /// <p><hr>
1119 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(audiodecoder)`\endlink
1120 /// <p>
1121 /// }
1122 /// \table_row3{ <b>`Player.Process(audiochannels)`</b>,
1123 /// \anchor Player_Process_audiochannels
1124 /// _string_,
1125 /// @return The audiodecoder name of the currently playing item.
1126 /// <p><hr>
1127 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiochannels `Player.Process(audiochannels)`\endlink
1128 /// <p>
1129 /// }
1130 /// \table_row3{ <b>`Player.Process(audiosamplerate)`</b>,
1131 /// \anchor Player_Process_audiosamplerate
1132 /// _string_,
1133 /// @return The samplerate of the currently playing item.
1134 /// <p><hr>
1135 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiosamplerate `Player.Process(audiosamplerate)`\endlink
1136 /// <p>
1137 /// }
1138 /// \table_row3{ <b>`Player.Process(audiobitspersample)`</b>,
1139 /// \anchor Player_Process_audiobitspersample
1140 /// _string_,
1141 /// @return The bits per sample of the currently playing item.
1142 /// <p><hr>
1143 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiobitspersample `Player.Process(audiobitspersample)`\endlink
1144 /// <p>
1145 /// }
1146 /// \table_end
1148 /// -----------------------------------------------------------------------------
1150 const infomap player_process[] = {{"videodecoder", PLAYER_PROCESS_VIDEODECODER},
1151 {"deintmethod", PLAYER_PROCESS_DEINTMETHOD},
1152 {"pixformat", PLAYER_PROCESS_PIXELFORMAT},
1153 {"videowidth", PLAYER_PROCESS_VIDEOWIDTH},
1154 {"videoheight", PLAYER_PROCESS_VIDEOHEIGHT},
1155 {"videofps", PLAYER_PROCESS_VIDEOFPS},
1156 {"videodar", PLAYER_PROCESS_VIDEODAR},
1157 {"videohwdecoder", PLAYER_PROCESS_VIDEOHWDECODER},
1158 {"audiodecoder", PLAYER_PROCESS_AUDIODECODER},
1159 {"audiochannels", PLAYER_PROCESS_AUDIOCHANNELS},
1160 {"audiosamplerate", PLAYER_PROCESS_AUDIOSAMPLERATE},
1161 {"audiobitspersample", PLAYER_PROCESS_AUDIOBITSPERSAMPLE},
1162 {"videoscantype", PLAYER_PROCESS_VIDEOSCANTYPE}};
1164 /// \page modules__infolabels_boolean_conditions
1165 /// \subsection modules__infolabels_boolean_conditions_Weather Weather
1166 /// \table_start
1167 /// \table_h3{ Labels, Type, Description }
1168 /// \table_row3{ <b>`Weather.IsFetched`</b>,
1169 /// \anchor Weather_IsFetched
1170 /// _boolean_,
1171 /// @return **True** if the weather data has been downloaded.
1172 /// <p>
1173 /// }
1174 /// \table_row3{ <b>`Weather.Conditions`</b>,
1175 /// \anchor Weather_Conditions
1176 /// _string_,
1177 /// @return The current weather conditions as textual description.
1178 /// @note This is looked up in a background process.
1179 /// <p>
1180 /// }
1181 /// \table_row3{ <b>`Weather.ConditionsIcon`</b>,
1182 /// \anchor Weather_ConditionsIcon
1183 /// _string_,
1184 /// @return The current weather conditions as an icon.
1185 /// @note This is looked up in a background process.
1186 /// <p>
1187 /// }
1188 /// \table_row3{ <b>`Weather.Temperature`</b>,
1189 /// \anchor Weather_Temperature
1190 /// _string_,
1191 /// @return The current weather temperature.
1192 /// <p>
1193 /// }
1194 /// \table_row3{ <b>`Weather.Location`</b>,
1195 /// \anchor Weather_Location
1196 /// _string_,
1197 /// @return The city/town which the above two items are for.
1198 /// <p>
1199 /// }
1200 /// \table_row3{ <b>`Weather.Fanartcode`</b>,
1201 /// \anchor Weather_fanartcode
1202 /// _string_,
1203 /// @return The current weather fanartcode.
1204 /// <p>
1205 /// }
1206 /// \table_row3{ <b>`Weather.Plugin`</b>,
1207 /// \anchor Weather_plugin
1208 /// _string_,
1209 /// @return The current weather plugin.
1210 /// <p>
1211 /// }
1212 /// \table_end
1214 /// -----------------------------------------------------------------------------
1215 const infomap weather[] = {{ "isfetched", WEATHER_IS_FETCHED },
1216 { "conditions", WEATHER_CONDITIONS_TEXT }, // labels from here
1217 { "temperature", WEATHER_TEMPERATURE },
1218 { "location", WEATHER_LOCATION },
1219 { "fanartcode", WEATHER_FANART_CODE },
1220 { "plugin", WEATHER_PLUGIN },
1221 { "conditionsicon", WEATHER_CONDITIONS_ICON }};
1223 /// \page modules__infolabels_boolean_conditions
1224 /// \subsection modules__infolabels_boolean_conditions_System System
1225 /// @todo some values are hardcoded in the middle of the code - refactor to make it easier to track
1226 /// \table_start
1227 /// \table_h3{ Labels, Type, Description }
1228 /// \table_row3{ <b>`System.AlarmLessOrEqual(alarmname\,seconds)`</b>,
1229 /// \anchor System_AlarmLessOrEqual
1230 /// _boolean_,
1231 /// @return **True** if the alarm with `alarmname` has less or equal to `seconds` left.
1232 /// @param alarmname - The name of the alarm. It can be one of the following:
1233 /// - shutdowntimer
1234 /// @param seconds - Time in seconds to compare with the alarm trigger event
1235 /// @note **Example:** `System.Alarmlessorequal(shutdowntimer\,119)`\,
1236 /// will return true when the shutdowntimer has less then 2 minutes
1237 /// left.
1238 /// <p>
1239 /// }
1240 /// \table_row3{ <b>`System.HasNetwork`</b>,
1241 /// \anchor System_HasNetwork
1242 /// _boolean_,
1243 /// @return **True** if the Kodi host has a network available.
1244 /// @note This feature is NOT implemented. Always returns true
1245 /// <p>
1246 /// }
1247 /// \table_row3{ <b>`System.HasMediadvd`</b>,
1248 /// \anchor System_HasMediadvd
1249 /// _boolean_,
1250 /// @return **True** if there is a CD or DVD in the DVD-ROM drive.
1251 /// <p>
1252 /// }
1253 /// \table_row3{ <b>`System.HasMediaAudioCD`</b>,
1254 /// \anchor System_HasMediaAudioCD
1255 /// _boolean_,
1256 /// @return **True** if there is an audio CD in the optical drive. **False** if no drive
1257 /// available\, empty drive or other medium.
1258 /// <p><hr>
1259 /// @skinning_v18 **[New Boolean Condition]** \link System_HasMediaAudioCD
1260 /// `System.HasMediaAudioCD` \endlink <p>
1261 /// }
1262 /// \table_row3{ <b>`System.DVDReady`</b>,
1263 /// \anchor System_DVDReady
1264 /// _boolean_,
1265 /// @return **True** if the disc is ready to use.
1266 /// <p>
1267 /// }
1268 /// \table_row3{ <b>`System.TrayOpen`</b>,
1269 /// \anchor System_TrayOpen
1270 /// _boolean_,
1271 /// @return **True** if the disc tray is open.
1272 /// <p>
1273 /// }
1274 /// \table_row3{ <b>`System.HasLocks`</b>,
1275 /// \anchor System_HasLocks
1276 /// _boolean_,
1277 /// @return **True** if the system has an active lock mode.
1278 /// <p>
1279 /// }
1280 /// \table_row3{ <b>`System.IsMaster`</b>,
1281 /// \anchor System_IsMaster
1282 /// _boolean_,
1283 /// @return **True** if the system is in master mode.
1284 /// <p>
1285 /// }
1286 /// \table_row3{ <b>`System.ShowExitButton`</b>,
1287 /// \anchor System_ShowExitButton
1288 /// _boolean_,
1289 /// @return **True** if the exit button should be shown (configurable via advanced settings).
1290 /// <p>
1291 /// }
1292 /// \table_row3{ <b>`System.DPMSActive`</b>,
1293 /// \anchor System_DPMSActive
1294 /// _boolean_,
1295 /// @return **True** if DPMS (VESA Display Power Management Signaling) mode is active.
1296 /// <p>
1297 /// }
1298 /// \table_row3{ <b>`System.IsStandalone`</b>,
1299 /// \anchor System_IsStandalone
1300 /// _boolean_,
1301 /// @return **True** if Kodi is running in standalone mode.
1302 /// <p>
1303 /// }
1304 /// \table_row3{ <b>`System.IsFullscreen`</b>,
1305 /// \anchor System_IsFullscreen
1306 /// _boolean_,
1307 /// @return **True** if Kodi is running fullscreen.
1308 /// <p>
1309 /// }
1310 /// \table_row3{ <b>`System.LoggedOn`</b>,
1311 /// \anchor System_LoggedOn
1312 /// _boolean_,
1313 /// @return **True** if a user is currently logged on under a profile.
1314 /// <p>
1315 /// }
1316 /// \table_row3{ <b>`System.HasLoginScreen`</b>,
1317 /// \anchor System_HasLoginScreen
1318 /// _boolean_,
1319 /// @return **True** if the profile login screen is enabled.
1320 /// <p>
1321 /// }
1322 /// \table_row3{ <b>`System.HasPVR`</b>,
1323 /// \anchor System_HasPVR
1324 /// _boolean_,
1325 /// @return **True** if PVR is supported from Kodi.
1326 /// @note normally always true
1328 /// }
1329 /// \table_row3{ <b>`System.HasPVRAddon`</b>,
1330 /// \anchor System_HasPVRAddon
1331 /// _boolean_,
1332 /// @return **True** if at least one pvr client addon is installed and enabled.
1333 /// @param id - addon id of the PVR addon
1334 /// <p><hr>
1335 /// @skinning_v17 **[New Boolean Condition]** \link System_HasPVRAddon
1336 /// `System.HasPVRAddon`\endlink <p>
1337 /// }
1338 /// \table_row3{ <b>`System.HasCMS`</b>,
1339 /// \anchor System_HasCMS
1340 /// _boolean_,
1341 /// @return **True** if colour management is supported from Kodi.
1342 /// @note currently only supported for OpenGL
1343 /// <p><hr>
1344 /// @skinning_v17 **[New Boolean Condition]** \link System_HasCMS `System.HasCMS`\endlink
1345 /// <p>
1346 /// }
1347 /// \table_row3{ <b>`System.HasActiveModalDialog`</b>,
1348 /// \anchor System_HasActiveModalDialog
1349 /// _boolean_,
1350 /// @return **True** if a modal dialog is active.
1351 /// <p><hr>
1352 /// @skinning_v18 **[New Boolean Condition]** \link System_HasActiveModalDialog
1353 /// `System.HasActiveModalDialog`\endlink <p>
1354 /// }
1355 /// \table_row3{ <b>`System.HasVisibleModalDialog`</b>,
1356 /// \anchor System_HasVisibleModalDialog
1357 /// _boolean_,
1358 /// @return **True** if a modal dialog is visible.
1359 /// <p><hr>
1360 /// @skinning_v18 **[New Boolean Condition]** \link System_HasVisibleModalDialog
1361 /// `System.HasVisibleModalDialog`\endlink <p>
1362 /// }
1363 /// \table_row3{ <b>`System.Platform.Linux`</b>,
1364 /// \anchor System_PlatformLinux
1365 /// _boolean_,
1366 /// @return **True** if Kodi is running on a linux/unix based computer.
1367 /// <p>
1368 /// }
1369 /// \table_row3{ <b>`System.Platform.Windows`</b>,
1370 /// \anchor System_PlatformWindows
1371 /// _boolean_,
1372 /// @return **True** if Kodi is running on a windows based computer.
1373 /// <p>
1374 /// }
1375 /// \table_row3{ <b>`System.Platform.UWP`</b>,
1376 /// \anchor System_PlatformUWP
1377 /// _boolean_,
1378 /// @return **True** if Kodi is running on Universal Windows Platform (UWP).
1379 /// <p><hr>
1380 /// @skinning_v18 **[New Boolean Condition]** \link System_PlatformUWP
1381 /// `System.Platform.UWP`\endlink <p>
1382 /// }
1383 /// \table_row3{ <b>`System.Platform.OSX`</b>,
1384 /// \anchor System_PlatformOSX
1385 /// _boolean_,
1386 /// @return **True** if Kodi is running on an OSX based computer.
1387 /// <p>
1388 /// }
1389 /// \table_row3{ <b>`System.Platform.IOS`</b>,
1390 /// \anchor System_PlatformIOS
1391 /// _boolean_,
1392 /// @return **True** if Kodi is running on an IOS device.
1393 /// <p>
1394 /// }
1395 /// \table_row3{ <b>`System.Platform.TVOS`</b>,
1396 /// \anchor System_PlatformTVOS
1397 /// _boolean_,
1398 /// @return **True** if Kodi is running on a tvOS device.
1399 /// <p><hr>
1400 /// @skinning_v19 **[New Boolean Condition]** \link System_PlatformTVOS
1401 /// `System.Platform.TVOS`\endlink <p>
1402 /// }
1403 /// \table_row3{ <b>`System.Platform.Darwin`</b>,
1404 /// \anchor System_PlatformDarwin
1405 /// _boolean_,
1406 /// @return **True** if Kodi is running on an OSX or IOS system.
1407 /// <p>
1408 /// }
1409 /// \table_row3{ <b>`System.Platform.Android`</b>,
1410 /// \anchor System_PlatformAndroid
1411 /// _boolean_,
1412 /// @return **True** if Kodi is running on an android device.
1413 /// <p>
1414 /// }
1415 /// \table_row3{ <b>`System.Platform.WebOS`</b>,
1416 /// \anchor System_PlatformWebOS
1417 /// _boolean_,
1418 /// @return **True** if Kodi is running on a WebOS device.
1419 /// <p><hr>
1420 /// @skinning_v21 **[New Boolean Condition]** \link System_PlatformWebOS
1421 /// `System.Platform.WebOS`\endlink <p>
1422 /// }
1423 /// \table_row3{ <b>`System.CanPowerDown`</b>,
1424 /// \anchor System_CanPowerDown
1425 /// _boolean_,
1426 /// @return **True** if Kodi can powerdown the system.
1427 /// <p>
1428 /// }
1429 /// \table_row3{ <b>`System.CanSuspend`</b>,
1430 /// \anchor System_CanSuspend
1431 /// _boolean_,
1432 /// @return **True** if Kodi can suspend the system.
1433 /// <p>
1434 /// }
1435 /// \table_row3{ <b>`System.CanHibernate`</b>,
1436 /// \anchor System_CanHibernate
1437 /// _boolean_,
1438 /// @return **True** if Kodi can hibernate the system.
1439 /// <p>
1440 /// }
1441 /// \table_row3{ <b>`System.HasHiddenInput`</b>,
1442 /// \anchor System_HasHiddenInput
1443 /// _boolean_,
1444 /// @return **True** when to osd keyboard/numeric dialog requests a
1445 /// password/pincode.
1446 /// <p><hr>
1447 /// @skinning_v16 **[New Boolean Condition]** \link System_HasHiddenInput
1448 /// `System.HasHiddenInput`\endlink <p>
1449 /// }
1450 /// \table_row3{ <b>`System.CanReboot`</b>,
1451 /// \anchor System_CanReboot
1452 /// _boolean_,
1453 /// @return **True** if Kodi can reboot the system.
1454 /// <p>
1455 /// }
1456 /// \table_row3{ <b>`System.ScreenSaverActive`</b>,
1457 /// \anchor System_ScreenSaverActive
1458 /// _boolean_,
1459 /// @return **True** if ScreenSaver is active.
1460 /// <p>
1461 /// }
1462 /// \table_row3{ <b>`System.IdleShutdownInhibited`</b>,
1463 /// \anchor System_IdleShutdownInhibited
1464 /// _boolean_,
1465 /// @return **True** when shutdown on idle is disabled.
1466 /// <p>
1467 /// }
1468 /// \table_row3{ <b>`System.HasShutdown`</b>,
1469 /// \anchor System_HasShutdown
1470 /// _boolean_,
1471 /// @return **True** if Kodi can shutdown the system.
1472 /// <p>
1473 /// }
1474 /// \table_row3{ <b>`System.Time`</b>,
1475 /// \anchor System_Time
1476 /// _string_,
1477 /// @return The current time.
1478 /// <p>
1479 /// }
1480 /// \table_row3{ <b>`System.Time(format)`</b>,
1481 /// \anchor System_Time_format
1482 /// _string_,
1483 /// @return The current time in a specified format.
1484 /// @param format [opt] The format of the return time value.
1485 /// See \ref TIME_FORMAT for the list of possible values.
1486 /// <p>
1487 /// }
1488 /// \table_row3{ <b>`System.Time(startTime[\,endTime])`</b>,
1489 /// \anchor System_Time
1490 /// _boolean_,
1491 /// @return **True** if the current system time is >= `startTime` and < `endTime` (if defined).
1492 /// @param startTime - Start time
1493 /// @param endTime - [opt] End time
1494 /// <p>
1495 /// @note Time must be specified in the format HH:mm\, using
1496 /// a 24 hour clock.
1497 /// <p>
1498 /// }
1499 /// \table_row3{ <b>`System.Date`</b>,
1500 /// \anchor System_Date
1501 /// _string_,
1502 /// @return The current date.
1503 /// <p><hr>
1504 /// @skinning_v16 **[Infolabel Updated]** \link System_Date `System.Date`\endlink
1505 /// will now return the full day and month names. old: sat\, jul 18 2015
1506 /// new: saturday\, july 18 2015
1507 /// <p>
1508 /// }
1509 /// \table_row3{ <b>`System.Date(format)`</b>,
1510 /// \anchor System_Date_format
1511 /// _string_,
1512 /// @return The current date using a specified format.
1513 /// @param format - the format for the date. It can be one of the following
1514 /// values:
1515 /// - **d** - day of month (1-31)
1516 /// - **dd** - day of month (01-31)
1517 /// - **ddd** - short day of the week Mon-Sun
1518 /// - **DDD** - long day of the week Monday-Sunday
1519 /// - **m** - month (1-12)
1520 /// - **mm** - month (01-12)
1521 /// - **mmm** - short month name Jan-Dec
1522 /// - **MMM** - long month name January-December
1523 /// - **yy** - 2-digit year
1524 /// - **yyyy** - 4-digit year
1525 /// <p>
1526 /// }
1527 /// \table_row3{ <b>`System.Date(startDate[\,endDate])`</b>,
1528 /// \anchor System_Date
1529 /// _boolean_,
1530 /// @return **True** if the current system date is >= `startDate` and < `endDate` (if defined).
1531 /// @param startDate - The start date
1532 /// @param endDate - [opt] The end date
1533 /// @note Date must be specified in the format MM-DD or YY-MM-DD.
1534 /// <p>
1535 /// }
1536 /// \table_row3{ <b>`System.AlarmPos`</b>,
1537 /// \anchor System_AlarmPos
1538 /// _string_,
1539 /// @return The shutdown Timer position.
1540 /// <p>
1541 /// }
1542 /// \table_row3{ <b>`System.BatteryLevel`</b>,
1543 /// \anchor System_BatteryLevel
1544 /// _string_,
1545 /// @return The remaining battery level in range 0-100.
1546 /// <p>
1547 /// }
1548 /// \table_row3{ <b>`System.FreeSpace`</b>,
1549 /// \anchor System_FreeSpace
1550 /// _string_,
1551 /// @return The total Freespace on the drive.
1552 /// <p>
1553 /// }
1554 /// \table_row3{ <b>`System.UsedSpace`</b>,
1555 /// \anchor System_UsedSpace
1556 /// _string_,
1557 /// @return The total Usedspace on the drive.
1558 /// <p>
1559 /// }
1560 /// \table_row3{ <b>`System.TotalSpace`</b>,
1561 /// \anchor System_TotalSpace
1562 /// _string_,
1563 /// @return The total space on the drive.
1564 /// <p>
1565 /// }
1566 /// \table_row3{ <b>`System.UsedSpacePercent`</b>,
1567 /// \anchor System_UsedSpacePercent
1568 /// _string_,
1569 /// @return The total Usedspace Percent on the drive.
1570 /// <p>
1571 /// }
1572 /// \table_row3{ <b>`System.FreeSpacePercent`</b>,
1573 /// \anchor System_FreeSpacePercent
1574 /// _string_,
1575 /// @return The total Freespace Percent on the drive.
1576 /// <p>
1577 /// }
1578 /// \table_row3{ <b>`System.CPUTemperature`</b>,
1579 /// \anchor System_CPUTemperature
1580 /// _string_,
1581 /// @return The current CPU temperature.
1582 /// <p>
1583 /// }
1584 /// \table_row3{ <b>`System.CpuUsage`</b>,
1585 /// \anchor System_CpuUsage
1586 /// _string_,
1587 /// @return The the cpu usage for each individual cpu core.
1588 /// <p>
1589 /// }
1590 /// \table_row3{ <b>`System.GPUTemperature`</b>,
1591 /// \anchor System_GPUTemperature
1592 /// _string_,
1593 /// @return The current GPU temperature.
1594 /// <p>
1595 /// }
1596 /// \table_row3{ <b>`System.FanSpeed`</b>,
1597 /// \anchor System_FanSpeed
1598 /// _string_,
1599 /// @return The current fan speed.
1600 /// <p>
1601 /// }
1602 /// \table_row3{ <b>`System.BuildVersion`</b>,
1603 /// \anchor System_BuildVersion
1604 /// _string_,
1605 /// @return The version of build.
1606 /// <p>
1607 /// }
1608 /// \table_row3{ <b>`System.BuildVersionShort`</b>,
1609 /// \anchor System_BuildVersionShort
1610 /// _string_,
1611 /// @return The shorter string with version of build.
1612 /// <p>
1613 /// }
1614 /// \table_row3{ <b>`System.BuildDate`</b>,
1615 /// \anchor System_BuildDate
1616 /// _string_,
1617 /// @return The date of build.
1618 /// <p>
1619 /// }
1620 /// \table_row3{ <b>`System.BuildVersionCode`</b>,
1621 /// \anchor System_BuildVersionCode
1622 /// _string_,
1623 /// @return The version code of build.
1624 /// <p>
1625 /// }
1626 /// \table_row3{ <b>`System.BuildVersionGit`</b>,
1627 /// \anchor System_BuildVersionGit
1628 /// _string_,
1629 /// @return The git version of build.
1630 /// <p>
1631 /// }
1632 /// \table_row3{ <b>`System.FriendlyName`</b>,
1633 /// \anchor System_FriendlyName
1634 /// _string_,
1635 /// @return The Kodi instance name.
1636 /// @note It will auto append (%hostname%) in case
1637 /// the device name was not changed. eg. "Kodi (htpc)"
1638 /// <p>
1639 /// }
1640 /// \table_row3{ <b>`System.FPS`</b>,
1641 /// \anchor System_FPS
1642 /// _string_,
1643 /// @return The current rendering speed (frames per second).
1644 /// <p>
1645 /// }
1646 /// \table_row3{ <b>`System.FreeMemory`</b>,
1647 /// \anchor System_FreeMemory
1648 /// _string_,
1649 /// @return The amount of free memory in Mb.
1650 /// <p>
1651 /// }
1652 /// \table_row3{ <b>`System.ScreenMode`</b>,
1653 /// \anchor System_ScreenMode
1654 /// _string_,
1655 /// @return The screenmode (eg windowed / fullscreen).
1656 /// <p>
1657 /// }
1658 /// \table_row3{ <b>`System.ScreenWidth`</b>,
1659 /// \anchor System_ScreenWidth
1660 /// _string_,
1661 /// @return The width of screen in pixels.
1662 /// <p>
1663 /// }
1664 /// \table_row3{ <b>`System.ScreenHeight`</b>,
1665 /// \anchor System_ScreenHeight
1666 /// _string_,
1667 /// @return The height of screen in pixels.
1668 /// <p>
1669 /// }
1670 /// \table_row3{ <b>`System.StartupWindow`</b>,
1671 /// \anchor System_StartupWindow
1672 /// _string_,
1673 /// @return The Window Kodi will load on startup.
1674 /// <p><hr>
1675 /// @skinning_v13 **[New Infolabel]** \link System_StartupWindow `System.StartupWindow`\endlink
1676 /// <p>
1677 /// }
1678 /// \table_row3{ <b>`System.CurrentWindow`</b>,
1679 /// \anchor System_CurrentWindow
1680 /// _string_,
1681 /// @return The current Window in use.
1682 /// <p>
1683 /// }
1684 /// \table_row3{ <b>`System.CurrentControl`</b>,
1685 /// \anchor System_CurrentControl
1686 /// _string_,
1687 /// @return The current focused control
1688 /// <p>
1689 /// }
1690 /// \table_row3{ <b>`System.CurrentControlId`</b>,
1691 /// \anchor System_CurrentControlId
1692 /// _string_,
1693 /// @return The ID of the currently focused control.
1694 /// <p>
1695 /// }
1696 /// \table_row3{ <b>`System.DVDLabel`</b>,
1697 /// \anchor System_DVDLabel
1698 /// _string_,
1699 /// @return the label of the disk in the DVD-ROM drive.
1700 /// <p>
1701 /// }
1702 /// \table_row3{ <b>`System.KernelVersion`</b>,
1703 /// \anchor System_KernelVersion
1704 /// _string_,
1705 /// @return The System kernel version.
1706 /// <p>
1707 /// }
1708 /// \table_row3{ <b>`System.OSVersionInfo`</b>,
1709 /// \anchor System_OSVersionInfo
1710 /// _string_,
1711 /// @return The system name + kernel version.
1712 /// <p>
1713 /// }
1714 /// \table_row3{ <b>`System.Uptime`</b>,
1715 /// \anchor System_Uptime
1716 /// _string_,
1717 /// @return The system current uptime.
1718 /// <p>
1719 /// }
1720 /// \table_row3{ <b>`System.TotalUptime`</b>,
1721 /// \anchor System_TotalUptime
1722 /// _string_,
1723 /// @return The system total uptime.
1724 /// <p>
1725 /// }
1726 /// \table_row3{ <b>`System.CpuFrequency`</b>,
1727 /// \anchor System_CpuFrequency
1728 /// _string_,
1729 /// @return The system cpu frequency.
1730 /// <p>
1731 /// }
1732 /// \table_row3{ <b>`System.ScreenResolution`</b>,
1733 /// \anchor System_ScreenResolution
1734 /// _string_,
1735 /// @return The screen resolution.
1736 /// <p>
1737 /// }
1738 /// \table_row3{ <b>`System.VideoEncoderInfo`</b>,
1739 /// \anchor System_VideoEncoderInfo
1740 /// _string_,
1741 /// @return The video encoder info.
1742 /// <p>
1743 /// }
1744 /// \table_row3{ <b>`System.InternetState`</b>,
1745 /// \anchor System_InternetState
1746 /// _string_,
1747 /// @return The internet state: connected or not connected.
1748 /// @warning Do not use to check status in a pythonscript since it is threaded.
1749 /// <p>
1750 /// }
1751 /// \table_row3{ <b>`System.Language`</b>,
1752 /// \anchor System_Language
1753 /// _string_,
1754 /// @return the current language.
1755 /// <p>
1756 /// }
1757 /// \table_row3{ <b>`System.Locale(type)`</b>,
1758 /// \anchor System_Locale
1759 /// _string_,
1760 /// @return Locale-specific information depending on the requested type.
1761 /// @param type - Can be one of the following:
1762 /// - <b>region</b> The currently selected region name within the selected language ( \link System_Language `System.Language` \endlink).
1763 /// - <b>iso</b> The country code of the currently selected region as specified in <a href="https://kodi.wiki/view/Language_support#What_is_langinfo.xml">langinfo.xml</a>.
1764 /// <p><hr>
1765 /// @skinning_v21 **[New Infolabel]** \link System_Locale
1766 /// `System.Locale(type)`\endlink
1767 /// <p>
1768 /// @skinning_v22 **[Removed options]** `timezonecountry` and `timezone` from \link System_Locale
1769 /// `System.Locale(type)`\endlink
1770 /// <p>
1771 /// }
1772 /// \table_row3{ <b>`System.ProfileName`</b>,
1773 /// \anchor System_ProfileName
1774 /// _string_,
1775 /// @return The user name of the currently logged in Kodi user
1776 /// <p>
1777 /// }
1778 /// \table_row3{ <b>`System.ProfileThumb`</b>,
1779 /// \anchor System_ProfileThumb
1780 /// _string_,
1781 /// @return The thumbnail image of the currently logged in Kodi user
1782 /// <p>
1783 /// }
1784 /// \table_row3{ <b>`System.ProfileCount`</b>,
1785 /// \anchor System_ProfileCount
1786 /// _string_,
1787 /// @return The number of defined profiles.
1788 /// <p>
1789 /// }
1790 /// \table_row3{ <b>`System.ProfileAutoLogin`</b>,
1791 /// \anchor System_ProfileAutoLogin
1792 /// _string_,
1793 /// @return The profile Kodi will auto login to.
1794 /// <p><hr>
1795 /// @skinning_v13 **[New Infolabel]** \link System_ProfileAutoLogin
1796 /// `System.ProfileAutoLogin`\endlink <p>
1797 /// }
1798 /// \table_row3{ <b>`System.StereoscopicMode`</b>,
1799 /// \anchor System_StereoscopicMode
1800 /// _string_,
1801 /// @return The preferred stereoscopic mode.
1802 /// @note Configured in settings > video > playback).
1803 /// <p><hr>
1804 /// @skinning_v13 **[New Infolabel]** \link System_StereoscopicMode
1805 /// `System.StereoscopicMode`\endlink <p>
1806 /// }
1807 /// \table_row3{ <b>`System.TemperatureUnits`</b>,
1808 /// \anchor System_TemperatureUnits
1809 /// _string_,
1810 /// @return the Celsius or the Fahrenheit symbol.
1811 /// <p>
1812 /// }
1813 /// \table_row3{ <b>`System.Progressbar`</b>,
1814 /// \anchor System_Progressbar
1815 /// _string_,
1816 /// @return The percentage of the currently active progress.
1817 /// <p>
1818 /// }
1819 /// \table_row3{ <b>`System.GetBool(boolean)`</b>,
1820 /// \anchor System_GetBool
1821 /// _string_,
1822 /// @return The value of any standard system boolean setting.
1823 /// @note Will not work with settings in advancedsettings.xml
1824 /// <p>
1825 /// }
1826 /// \table_row3{ <b>`System.Memory(type)`</b>,
1827 /// \anchor System_Memory
1828 /// _string_,
1829 /// @return The memory value depending on the requested type.
1830 /// @param type - Can be one of the following:
1831 /// - <b>free</b>
1832 /// - <b>free.percent</b>
1833 /// - <b>used</b>
1834 /// - <b>used.percent</b>
1835 /// - <b>total</b>
1836 /// <p>
1837 /// }
1838 /// \table_row3{ <b>`System.AddonTitle(id)`</b>,
1839 /// \anchor System_AddonTitle
1840 /// _string_,
1841 /// @return The title of the addon with the given id
1842 /// @param id - the addon id
1843 /// <p>
1844 /// }
1845 /// \table_row3{ <b>`System.AddonVersion(id)`</b>,
1846 /// \anchor System_AddonVersion
1847 /// _string_,
1848 /// @return The version of the addon with the given id.
1849 /// @param id - the addon id
1850 /// <p><hr>
1851 /// @skinning_v13 **[New Infolabel]** \link System_AddonVersion
1852 /// `System.AddonVersion(id)`\endlink <p>
1853 /// }
1854 /// \table_row3{ <b>`System.AddonIcon(id)`</b>,
1855 /// \anchor System_AddonVersion
1856 /// _string_,
1857 /// @return The icon of the addon with the given id.
1858 /// @param id - the addon id
1859 /// <p>
1860 /// }
1861 /// \table_row3{ <b>`System.AddonUpdateCount`</b>,
1862 /// \anchor System_AddonUpdateCount
1863 /// _string_,
1864 /// @return The number of available addon updates.
1865 /// <p><hr>
1866 /// @skinning_v19 **[New Infolabel]** \link System_AddonUpdateCount `
1867 /// System.AddonUpdateCount`\endlink <p>
1868 /// }
1869 /// \table_row3{ <b>`System.IdleTime(time)`</b>,
1870 /// \anchor System_IdleTime
1871 /// _boolean_,
1872 /// @return **True** if Kodi has had no input for `time` amount of seconds.
1873 /// @param time - elapsed seconds to check for idle activity.
1874 /// <p>
1875 /// }
1876 /// \table_row3{ <b>`System.PrivacyPolicy`</b>,
1877 /// \anchor System_PrivacyPolicy
1878 /// _string_,
1879 /// @return The official Kodi privacy policy.
1880 /// <p><hr>
1881 /// @skinning_v17 **[New Infolabel]** \link System_PrivacyPolicy `System.PrivacyPolicy`\endlink
1882 /// <p>
1883 /// }
1884 /// \table_row3{ <b>`System.SupportsCPUUsage`</b>,
1885 /// \anchor System_SupportsCPUUsage
1886 /// _boolean_,
1887 /// @return **True** if the system can provide CPU usage information.
1888 /// <p><hr>
1889 /// @skinning_v19 **[New Boolean Condition]** \link System_SupportsCPUUsage `
1890 /// System.SupportsCPUUsage`\endlink <p>
1891 /// }
1892 /// \table_row3{ <b>`System.SupportedHDRTypes`</b>,
1893 /// \anchor System_SupportedHDRTypes
1894 /// _string_,
1895 /// @return The display's supported HDR types.
1896 /// <p><hr>
1897 /// @skinning_v20 **[New Infolabel]** \link System_SupportedHDRTypes `System.SupportedHDRTypes`\endlink
1898 /// <p>
1899 /// }
1900 /// \table_row3{ <b>`System.IsScreensaverInhibited`</b>,
1901 /// \anchor System_IsScreensaverInhibited
1902 /// _boolean_,
1903 /// @return **True** when screensaver on idle is disabled.
1904 /// <p>
1905 /// }
1906 const infomap system_labels[] = {
1907 {"hasnetwork", SYSTEM_ETHERNET_LINK_ACTIVE},
1908 {"hasmediadvd", SYSTEM_MEDIA_DVD},
1909 {"hasmediaaudiocd", SYSTEM_MEDIA_AUDIO_CD},
1910 {"dvdready", SYSTEM_DVDREADY},
1911 {"trayopen", SYSTEM_TRAYOPEN},
1912 {"haslocks", SYSTEM_HASLOCKS},
1913 {"hashiddeninput", SYSTEM_HAS_INPUT_HIDDEN},
1914 {"hasloginscreen", SYSTEM_HAS_LOGINSCREEN},
1915 {"hasactivemodaldialog", SYSTEM_HAS_ACTIVE_MODAL_DIALOG},
1916 {"hasvisiblemodaldialog", SYSTEM_HAS_VISIBLE_MODAL_DIALOG},
1917 {"ismaster", SYSTEM_ISMASTER},
1918 {"isfullscreen", SYSTEM_ISFULLSCREEN},
1919 {"isstandalone", SYSTEM_ISSTANDALONE},
1920 {"loggedon", SYSTEM_LOGGEDON},
1921 {"showexitbutton", SYSTEM_SHOW_EXIT_BUTTON},
1922 {"canpowerdown", SYSTEM_CAN_POWERDOWN},
1923 {"cansuspend", SYSTEM_CAN_SUSPEND},
1924 {"canhibernate", SYSTEM_CAN_HIBERNATE},
1925 {"canreboot", SYSTEM_CAN_REBOOT},
1926 {"screensaveractive", SYSTEM_SCREENSAVER_ACTIVE},
1927 {"dpmsactive", SYSTEM_DPMS_ACTIVE},
1928 {"cputemperature", SYSTEM_CPU_TEMPERATURE}, // labels from here
1929 {"cpuusage", SYSTEM_CPU_USAGE},
1930 {"gputemperature", SYSTEM_GPU_TEMPERATURE},
1931 {"fanspeed", SYSTEM_FAN_SPEED},
1932 {"freespace", SYSTEM_FREE_SPACE},
1933 {"usedspace", SYSTEM_USED_SPACE},
1934 {"totalspace", SYSTEM_TOTAL_SPACE},
1935 {"usedspacepercent", SYSTEM_USED_SPACE_PERCENT},
1936 {"freespacepercent", SYSTEM_FREE_SPACE_PERCENT},
1937 {"buildversion", SYSTEM_BUILD_VERSION},
1938 {"buildversionshort", SYSTEM_BUILD_VERSION_SHORT},
1939 {"buildversioncode", SYSTEM_BUILD_VERSION_CODE},
1940 {"buildversiongit", SYSTEM_BUILD_VERSION_GIT},
1941 {"builddate", SYSTEM_BUILD_DATE},
1942 {"fps", SYSTEM_FPS},
1943 {"freememory", SYSTEM_FREE_MEMORY},
1944 {"language", SYSTEM_LANGUAGE},
1945 {"temperatureunits", SYSTEM_TEMPERATURE_UNITS},
1946 {"screenmode", SYSTEM_SCREEN_MODE},
1947 {"screenwidth", SYSTEM_SCREEN_WIDTH},
1948 {"screenheight", SYSTEM_SCREEN_HEIGHT},
1949 {"currentwindow", SYSTEM_CURRENT_WINDOW},
1950 {"currentcontrol", SYSTEM_CURRENT_CONTROL},
1951 {"currentcontrolid", SYSTEM_CURRENT_CONTROL_ID},
1952 {"dvdlabel", SYSTEM_DVD_LABEL},
1953 {"internetstate", SYSTEM_INTERNET_STATE},
1954 {"osversioninfo", SYSTEM_OS_VERSION_INFO},
1955 {"kernelversion", SYSTEM_OS_VERSION_INFO}, // old, not correct name
1956 {"uptime", SYSTEM_UPTIME},
1957 {"totaluptime", SYSTEM_TOTALUPTIME},
1958 {"cpufrequency", SYSTEM_CPUFREQUENCY},
1959 {"screenresolution", SYSTEM_SCREEN_RESOLUTION},
1960 {"videoencoderinfo", SYSTEM_VIDEO_ENCODER_INFO},
1961 {"profilename", SYSTEM_PROFILENAME},
1962 {"profilethumb", SYSTEM_PROFILETHUMB},
1963 {"profilecount", SYSTEM_PROFILECOUNT},
1964 {"profileautologin", SYSTEM_PROFILEAUTOLOGIN},
1965 {"progressbar", SYSTEM_PROGRESS_BAR},
1966 {"batterylevel", SYSTEM_BATTERY_LEVEL},
1967 {"friendlyname", SYSTEM_FRIENDLY_NAME},
1968 {"alarmpos", SYSTEM_ALARM_POS},
1969 {"isinhibit",
1970 SYSTEM_IDLE_SHUTDOWN_INHIBITED}, // Deprecated, replaced by "idleshutdowninhibited"
1971 {"idleshutdowninhibited", SYSTEM_IDLE_SHUTDOWN_INHIBITED},
1972 {"hasshutdown", SYSTEM_HAS_SHUTDOWN},
1973 {"haspvr", SYSTEM_HAS_PVR},
1974 {"startupwindow", SYSTEM_STARTUP_WINDOW},
1975 {"stereoscopicmode", SYSTEM_STEREOSCOPIC_MODE},
1976 {"hascms", SYSTEM_HAS_CMS},
1977 {"privacypolicy", SYSTEM_PRIVACY_POLICY},
1978 {"haspvraddon", SYSTEM_HAS_PVR_ADDON},
1979 {"addonupdatecount", SYSTEM_ADDON_UPDATE_COUNT},
1980 {"supportscpuusage", SYSTEM_SUPPORTS_CPU_USAGE},
1981 {"supportedhdrtypes", SYSTEM_SUPPORTED_HDR_TYPES},
1982 {"isscreensaverinhibited", SYSTEM_IS_SCREENSAVER_INHIBITED}};
1984 /// \page modules__infolabels_boolean_conditions
1985 /// \table_row3{ <b>`System.HasAddon(id)`</b>,
1986 /// \anchor System_HasAddon
1987 /// _boolean_,
1988 /// @return **True** if the specified addon is installed on the system.
1989 /// @param id - the addon id
1990 /// @skinning_v19 **[Boolean Condition Updated]** \link System_HasAddon `System.HasAddon(id)`\endlink
1991 /// <p>
1992 /// }
1993 /// \table_row3{ <b>`System.AddonIsEnabled(id)`</b>,
1994 /// \anchor System_AddonIsEnabled
1995 /// _boolean_,
1996 /// @return **True** if the specified addon is enabled on the system.
1997 /// @param id - The addon Id
1998 /// <p><hr>
1999 /// @skinning_v19 **[New Boolean Condition]** \link System_AddonIsEnabled `System.AddonIsEnabled(id)`\endlink
2000 /// <p>
2001 /// }
2002 /// \table_row3{ <b>`System.HasCoreId(id)`</b>,
2003 /// \anchor System_HasCoreId
2004 /// _boolean_,
2005 /// @return **True** if the CPU core with the given 'id' exists.
2006 /// @param id - the id of the CPU core
2007 /// <p>
2008 /// }
2009 /// \table_row3{ <b>`System.HasAlarm(alarm)`</b>,
2010 /// \anchor System_HasAlarm
2011 /// _boolean_,
2012 /// @return **True** if the system has the `alarm` alarm set.
2013 /// @param alarm - the name of the alarm
2014 /// <p>
2015 /// }
2016 /// \table_row3{ <b>`System.CoreUsage(id)`</b>,
2017 /// \anchor System_CoreUsage
2018 /// _string_,
2019 /// @return the usage of the CPU core with the given 'id'
2020 /// @param id - the id of the CPU core
2021 /// <p>
2022 /// }
2023 /// \table_row3{ <b>`System.Setting(hidewatched)`</b>,
2024 /// \anchor System_Setting
2025 /// _boolean_,
2026 /// @return **True** if 'hide watched items' is selected.
2027 /// <p>
2028 /// }
2029 /// \table_row3{ <b>`System.Setting(hideunwatchedepisodethumbs)`</b>,
2030 /// \anchor System_Setting_HideUnwatchedEpisodeThumbs
2031 /// _boolean_,
2032 /// @return **True** if 'hide unwatched episode setting is enabled'\, **False** otherwise.
2033 /// <p><hr>
2034 /// @skinning_v20 **[New Boolean Condition]** \link System_Setting_HideUnwatchedEpisodeThumbs `System.Setting(hideunwatchedepisodethumbs)`\endlink
2035 /// <p>
2036 /// }
2037 /// \table_end
2039 /// -----------------------------------------------------------------------------
2040 const infomap system_param[] = {{ "hasalarm", SYSTEM_HAS_ALARM },
2041 { "hascoreid", SYSTEM_HAS_CORE_ID },
2042 { "setting", SYSTEM_SETTING },
2043 { "hasaddon", SYSTEM_HAS_ADDON },
2044 { "addonisenabled", SYSTEM_ADDON_IS_ENABLED },
2045 { "coreusage", SYSTEM_GET_CORE_USAGE }};
2047 /// \page modules__infolabels_boolean_conditions
2048 /// \subsection modules__infolabels_boolean_conditions_Network Network
2049 /// \table_start
2050 /// \table_h3{ Labels, Type, Description }
2051 /// \table_row3{ <b>`Network.IsDHCP`</b>,
2052 /// \anchor Network_IsDHCP
2053 /// _boolean_,
2054 /// @return **True** if the network type is DHCP.
2055 /// @note Network type can be either DHCP or FIXED
2056 /// <p>
2057 /// }
2058 /// \table_row3{ <b>`Network.IPAddress`</b>,
2059 /// \anchor Network_IPAddress
2060 /// _string_,
2061 /// @return The system's IP Address. e.g. 192.168.1.15
2062 /// <p>
2063 /// }
2064 /// \table_row3{ <b>`Network.LinkState`</b>,
2065 /// \anchor Network_LinkState
2066 /// _string_,
2067 /// @return The network linkstate e.g. 10mbit/100mbit etc.
2068 /// <p>
2069 /// }
2070 /// \table_row3{ <b>`Network.MacAddress`</b>,
2071 /// \anchor Network_MacAddress
2072 /// _string_,
2073 /// @return The system's MAC address.
2074 /// <p>
2075 /// }
2076 /// \table_row3{ <b>`Network.SubnetMask`</b>,
2077 /// \anchor Network_SubnetMask
2078 /// _string_,
2079 /// @return The network subnet mask.
2080 /// <p>
2081 /// }
2082 /// \table_row3{ <b>`Network.GatewayAddress`</b>,
2083 /// \anchor Network_GatewayAddress
2084 /// _string_,
2085 /// @return The network gateway address.
2086 /// <p>
2087 /// }
2088 /// \table_row3{ <b>`Network.DNS1Address`</b>,
2089 /// \anchor Network_DNS1Address
2090 /// _string_,
2091 /// @return The network DNS 1 address.
2092 /// <p>
2093 /// }
2094 /// \table_row3{ <b>`Network.DNS2Address`</b>,
2095 /// \anchor Network_DNS2Address
2096 /// _string_,
2097 /// @return The network DNS 2 address.
2098 /// <p>
2099 /// }
2100 /// \table_end
2102 /// -----------------------------------------------------------------------------
2103 // clang-format off
2104 const infomap network_labels[] = {
2105 {"isdhcp", NETWORK_IS_DHCP},
2106 {"ipaddress", NETWORK_IP_ADDRESS}, //labels from here
2107 {"linkstate", NETWORK_LINK_STATE},
2108 {"macaddress", NETWORK_MAC_ADDRESS},
2109 {"subnetmask", NETWORK_SUBNET_MASK},
2110 {"gatewayaddress", NETWORK_GATEWAY_ADDRESS},
2111 {"dns1address", NETWORK_DNS1_ADDRESS},
2112 {"dns2address", NETWORK_DNS2_ADDRESS}
2114 // clang-format on
2116 /// \page modules__infolabels_boolean_conditions
2117 /// \subsection modules__infolabels_boolean_conditions_musicpartymode Music party mode
2118 /// \table_start
2119 /// \table_h3{ Labels, Type, Description }
2120 /// \table_row3{ <b>`MusicPartyMode.Enabled`</b>,
2121 /// \anchor MusicPartyMode_Enabled
2122 /// _boolean_,
2123 /// @return **True** if Party Mode is enabled.
2124 /// <p>
2125 /// }
2126 /// \table_row3{ <b>`MusicPartyMode.SongsPlayed`</b>,
2127 /// \anchor MusicPartyMode_SongsPlayed
2128 /// _string_,
2129 /// @return The number of songs played during Party Mode.
2130 /// <p>
2131 /// }
2132 /// \table_row3{ <b>`MusicPartyMode.MatchingSongs`</b>,
2133 /// \anchor MusicPartyMode_MatchingSongs
2134 /// _string_,
2135 /// @return The number of songs available to Party Mode.
2136 /// <p>
2137 /// }
2138 /// \table_row3{ <b>`MusicPartyMode.MatchingSongsPicked`</b>,
2139 /// \anchor MusicPartyMode_MatchingSongsPicked
2140 /// _string_,
2141 /// @return The number of songs picked already for Party Mode.
2142 /// <p>
2143 /// }
2144 /// \table_row3{ <b>`MusicPartyMode.MatchingSongsLeft`</b>,
2145 /// \anchor MusicPartyMode_MatchingSongsLeft
2146 /// _string_,
2147 /// @return The number of songs left to be picked from for Party Mode.
2148 /// <p>
2149 /// }
2150 /// \table_row3{ <b>`MusicPartyMode.RelaxedSongsPicked`</b>,
2151 /// \anchor MusicPartyMode_RelaxedSongsPicked
2152 /// _string_,
2153 /// @todo Not currently used
2154 /// <p>
2155 /// }
2156 /// \table_row3{ <b>`MusicPartyMode.RandomSongsPicked`</b>,
2157 /// \anchor MusicPartyMode_RandomSongsPicked
2158 /// _string_,
2159 /// @return The number of unique random songs picked during Party Mode.
2160 /// <p>
2161 /// }
2162 /// \table_end
2164 /// -----------------------------------------------------------------------------
2165 const infomap musicpartymode[] = {{ "enabled", MUSICPM_ENABLED },
2166 { "songsplayed", MUSICPM_SONGSPLAYED },
2167 { "matchingsongs", MUSICPM_MATCHINGSONGS },
2168 { "matchingsongspicked", MUSICPM_MATCHINGSONGSPICKED },
2169 { "matchingsongsleft", MUSICPM_MATCHINGSONGSLEFT },
2170 { "relaxedsongspicked", MUSICPM_RELAXEDSONGSPICKED },
2171 { "randomsongspicked", MUSICPM_RANDOMSONGSPICKED }};
2173 /// \page modules__infolabels_boolean_conditions
2174 /// \subsection modules__infolabels_boolean_conditions_MusicPlayer Music player
2175 /// \table_start
2176 /// \table_h3{ Labels, Type, Description }
2177 /// \table_row3{ <b>`MusicPlayer.Offset(number).Exists`</b>,
2178 /// \anchor MusicPlayer_Offset
2179 /// _boolean_,
2180 /// @return **True** if the music players playlist has a song queued in
2181 /// position (number).
2182 /// @param number - song position
2183 /// <p>
2184 /// }
2185 /// \table_row3{ <b>`MusicPlayer.Title`</b>,
2186 /// \anchor MusicPlayer_Title
2187 /// _string_,
2188 /// @return The title of the currently playing song.
2189 /// <p>
2190 /// }
2191 /// \table_row3{ <b>`MusicPlayer.offset(number).Title`</b>,
2192 /// \anchor MusicPlayer_Offset_Title
2193 /// _string_,
2194 /// @return The title of the song which has an offset `number` with respect to the
2195 /// current playing song.
2196 /// @param number - the offset number with respect to the current playing song
2197 /// <p>
2198 /// }
2199 /// \table_row3{ <b>`MusicPlayer.Position(number).Title`</b>,
2200 /// \anchor MusicPlayer_Position_Title
2201 /// _string_,
2202 /// @return The title of the song which as an offset `number` with respect to the
2203 /// start of the playlist.
2204 /// @param number - the offset number with respect to the start of the playlist
2205 /// <p>
2206 /// }
2207 /// \table_row3{ <b>`MusicPlayer.Album`</b>,
2208 /// \anchor MusicPlayer_Album
2209 /// _string_,
2210 /// @return The album from which the current song is from.
2211 /// <p>
2212 /// }
2213 /// \table_row3{ <b>`MusicPlayer.offset(number).Album`</b>,
2214 /// \anchor MusicPlayer_OffSet_Album
2215 /// _string_,
2216 /// @return The album from which the song with offset `number` with respect to
2217 /// the current song is from.
2218 /// @param number - the offset number with respect to the current playing song
2219 /// <p>
2220 /// }
2221 /// \table_row3{ <b>`MusicPlayer.Position(number).Album`</b>,
2222 /// \anchor MusicPlayer_Position_Album
2223 /// _string_,
2224 /// @return The album from which the song with offset `number` with respect to
2225 /// the start of the playlist is from.
2226 /// @param number - the offset number with respect to the start of the playlist
2227 /// <p>
2228 /// }
2229 /// \table_row3{ <b>`MusicPlayer.Property(Album_Mood)`</b>,
2230 /// \anchor MusicPlayer_Property_Album_Mood
2231 /// _string_,
2232 /// @return The moods of the currently playing Album
2233 /// <p>
2234 /// }
2235 /// \table_row3{ <b>`MusicPlayer.Property(Role.Composer)`</b>,
2236 /// \anchor MusicPlayer_Property_Role_Composer
2237 /// _string_,
2238 /// @return The name of the person who composed the selected song.
2239 /// <p><hr>
2240 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Composer `MusicPlayer.Property(Role.Composer)`\endlink
2241 /// <p>
2242 /// }
2243 /// \table_row3{ <b>`MusicPlayer.Property(Role.Conductor)`</b>,
2244 /// \anchor MusicPlayer_Property_Role_Conductor
2245 /// _string_,
2246 /// @return The name of the person who conducted the selected song.
2247 /// <p><hr>
2248 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Conductor `MusicPlayer.Property(Role.Conductor)`\endlink
2249 /// <p>
2250 /// }
2251 /// \table_row3{ <b>`MusicPlayer.Property(Role.Orchestra)`</b>,
2252 /// \anchor MusicPlayer_Property_Role_Orchestra
2253 /// _string_,
2254 /// @return The name of the orchestra performing the selected song.
2255 /// <p><hr>
2256 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Orchestra `MusicPlayer.Property(Role.Orchestra)`\endlink
2257 /// <p>
2258 /// }
2259 /// \table_row3{ <b>`MusicPlayer.Property(Role.Lyricist)`</b>,
2260 /// \anchor MusicPlayer_Property_Role_Lyricist
2261 /// _string_,
2262 /// @return The name of the person who wrote the lyrics of the selected song.
2263 /// <p><hr>
2264 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Lyricist `MusicPlayer.Property(Role.Lyricist)`\endlink
2265 /// <p>
2266 /// }
2267 /// \table_row3{ <b>`MusicPlayer.Property(Role.Remixer)`</b>,
2268 /// \anchor MusicPlayer_Property_Role_Remixer
2269 /// _string_,
2270 /// @return The name of the person who remixed the selected song.
2271 /// <p><hr>
2272 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Remixer `MusicPlayer.Property(Role.Remixer)`\endlink
2273 /// <p>
2274 /// }
2275 /// \table_row3{ <b>`MusicPlayer.Property(Role.Arranger)`</b>,
2276 /// \anchor MusicPlayer_Property_Role_Arranger
2277 /// _string_,
2278 /// @return The name of the person who arranged the selected song.
2279 /// <p><hr>
2280 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Arranger `MusicPlayer.Property(Role.Arranger)`\endlink
2281 /// <p>
2282 /// }
2283 /// \table_row3{ <b>`MusicPlayer.Property(Role.Engineer)`</b>,
2284 /// \anchor MusicPlayer_Property_Role_Engineer
2285 /// _string_,
2286 /// @return The name of the person who was the engineer of the selected song.
2287 /// <p><hr>
2288 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Engineer `MusicPlayer.Property(Role.Engineer)`\endlink
2289 /// <p>
2290 /// }
2291 /// \table_row3{ <b>`MusicPlayer.Property(Role.Producer)`</b>,
2292 /// \anchor MusicPlayer_Property_Role_Producer
2293 /// _string_,
2294 /// @return The name of the person who produced the selected song.
2295 /// <p><hr>
2296 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Producer `MusicPlayer.Property(Role.Producer)`\endlink
2297 /// <p>
2298 /// }
2299 /// \table_row3{ <b>`MusicPlayer.Property(Role.DJMixer)`</b>,
2300 /// \anchor MusicPlayer_Property_Role_DJMixer
2301 /// _string_,
2302 /// @return The name of the dj who remixed the selected song.
2303 /// <p><hr>
2304 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_DJMixer `MusicPlayer.Property(Role.DJMixer)`\endlink
2305 /// <p>
2306 /// }
2307 /// \table_row3{ <b>`MusicPlayer.Property(Role.Mixer)`</b>,
2308 /// \anchor MusicPlayer_Property_Role_Mixer
2309 /// _string_,
2310 /// @return The name of the dj who remixed the selected song.
2311 /// @todo So maybe rather than a row each have one entry for Role.XXXXX with composer\, arranger etc. as listed values
2312 /// @note MusicPlayer.Property(Role.any_custom_role) also works\,
2313 /// where any_custom_role could be an instrument violin or some other production activity e.g. sound engineer.
2314 /// The roles listed (composer\, arranger etc.) are standard ones but there are many possible.
2315 /// Music file tagging allows for the musicians and all other people involved in the recording to be added\, Kodi
2316 /// will gathers and stores that data\, and it is available to GUI.
2317 /// <p><hr>
2318 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Mixer `MusicPlayer.Property(Role.Mixer)`\endlink
2319 /// <p>
2320 /// }
2321 /// \table_row3{ <b>`MusicPlayer.Property(Album_Mood)`</b>,
2322 /// \anchor MusicPlayer_Property_Album_Mood
2323 /// _string_,
2324 /// @return the moods of the currently playing Album
2325 /// <p>
2326 /// }
2327 /// \table_row3{ <b>`MusicPlayer.Property(Album_Style)`</b>,
2328 /// \anchor MusicPlayer_Property_Album_Style
2329 /// _string_,
2330 /// @return the styles of the currently playing Album.
2331 /// <p>
2332 /// }
2333 /// \table_row3{ <b>`MusicPlayer.Property(Album_Theme)`</b>,
2334 /// \anchor MusicPlayer_Property_Album_Theme
2335 /// _string_,
2336 /// @return The themes of the currently playing Album
2337 /// <p>
2338 /// }
2339 /// \table_row3{ <b>`MusicPlayer.Property(Album_Type)`</b>,
2340 /// \anchor MusicPlayer_Property_Album_Type
2341 /// _string_,
2342 /// @return The album type (e.g. compilation\, enhanced\, explicit lyrics) of the
2343 /// currently playing album.
2344 /// <p>
2345 /// }
2346 /// \table_row3{ <b>`MusicPlayer.Property(Album_Label)`</b>,
2347 /// \anchor MusicPlayer_Property_Album_Label
2348 /// _string_,
2349 /// @return The record label of the currently playing album.
2350 /// <p>
2351 /// }
2352 /// \table_row3{ <b>`MusicPlayer.Property(Album_Description)`</b>,
2353 /// \anchor MusicPlayer_Property_Album_Description
2354 /// _string_,
2355 /// @return A review of the currently playing album
2356 /// <p>
2357 /// }
2358 /// \table_row3{ <b>`MusicPlayer.Artist`</b>,
2359 /// \anchor MusicPlayer_Artist
2360 /// _string_,
2361 /// @return Artist(s) of current song.
2362 /// <p>
2363 /// }
2364 /// \table_row3{ <b>`MusicPlayer.offset(number).Artist`</b>,
2365 /// \anchor MusicPlayer_Offset_Artist
2366 /// _string_,
2367 /// @return Artist(s) of the song which has an offset `number` with respect
2368 /// to the current playing song.
2369 /// @param number - the offset of the song with respect to the current
2370 /// playing song
2371 /// <p>
2372 /// }
2373 /// \table_row3{ <b>`MusicPlayer.Position(number).Artist`</b>,
2374 /// \anchor MusicPlayer_Position_Artist
2375 /// _string_,
2376 /// @return Artist(s) of the song which has an offset `number` with respect
2377 /// to the start of the playlist.
2378 /// @param number - the offset of the song with respect to
2379 /// the start of the playlist
2380 /// <p>
2381 /// }
2382 /// \table_row3{ <b>`MusicPlayer.AlbumArtist`</b>,
2383 /// \anchor MusicPlayer_AlbumArtist
2384 /// _string_,
2385 /// @return The album artist of the currently playing song.
2386 /// <p>
2387 /// }
2388 /// \table_row3{ <b>`MusicPlayer.Cover`</b>,
2389 /// \anchor MusicPlayer_Cover
2390 /// _string_,
2391 /// @return The album cover of currently playing song.
2392 /// <p>
2393 /// }
2394 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Sortname)`</b>,
2395 /// \anchor MusicPlayer_Property_Artist_Sortname
2396 /// _string_,
2397 /// @return The sortname of the currently playing Artist.
2398 /// <p><hr>
2399 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Sortname `MusicPlayer.Property(Artist_Sortname)`\endlink
2400 /// <p>
2401 /// }
2402 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Type)`</b>,
2403 /// \anchor MusicPlayer_Property_Artist_Type
2404 /// _string_,
2405 /// @return The type of the currently playing Artist - person\,
2406 /// group\, orchestra\, choir etc.
2407 /// <p><hr>
2408 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Type `MusicPlayer.Property(Artist_Type)`\endlink
2409 /// <p>
2410 /// }
2411 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Gender)`</b>,
2412 /// \anchor MusicPlayer_Property_Artist_Gender
2413 /// _string_,
2414 /// @return The gender of the currently playing Artist - male\,
2415 /// female\, other.
2416 /// <p><hr>
2417 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Gender `MusicPlayer.Property(Artist_Gender)`\endlink
2418 /// <p>
2419 /// }
2420 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Disambiguation)`</b>,
2421 /// \anchor MusicPlayer_Property_Artist_Disambiguation
2422 /// _string_,
2423 /// @return A brief description of the currently playing Artist that differentiates them
2424 /// from others with the same name.
2425 /// <p><hr>
2426 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Disambiguation `MusicPlayer.Property(Artist_Disambiguation)`\endlink
2427 /// <p>
2428 /// }
2429 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Born)`</b>,
2430 /// \anchor MusicPlayer_Property_Artist_Born
2431 /// _string_,
2432 /// @return The date of Birth of the currently playing Artist.
2433 /// <p>
2434 /// }
2435 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Died)`</b>,
2436 /// \anchor MusicPlayer_Property_Artist_Died
2437 /// _string_,
2438 /// @return The date of Death of the currently playing Artist.
2439 /// <p>
2440 /// }
2441 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Formed)`</b>,
2442 /// \anchor MusicPlayer_Property_Artist_Formed
2443 /// _string_,
2444 /// @return The Formation date of the currently playing Artist/Band.
2445 /// <p>
2446 /// }
2447 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Disbanded)`</b>,
2448 /// \anchor MusicPlayer_Property_Artist_Disbanded
2449 /// _string_,
2450 /// @return The disbanding date of the currently playing Artist/Band.
2451 /// <p>
2452 /// }
2453 /// \table_row3{ <b>`MusicPlayer.Property(Artist_YearsActive)`</b>,
2454 /// \anchor MusicPlayer_Property_Artist_YearsActive
2455 /// _string_,
2456 /// @return The years the currently Playing artist has been active.
2457 /// <p>
2458 /// }
2459 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Instrument)`</b>,
2460 /// \anchor MusicPlayer_Property_Artist_Instrument
2461 /// _string_,
2462 /// @return The instruments played by the currently playing artist.
2463 /// <p>
2464 /// }
2465 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Description)`</b>,
2466 /// \anchor MusicPlayer_Property_Artist_Description
2467 /// _string_,
2468 /// @return A biography of the currently playing artist.
2469 /// <p>
2470 /// }
2471 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Mood)`</b>,
2472 /// \anchor MusicPlayer_Property_Artist_Mood
2473 /// _string_,
2474 /// @return The moods of the currently playing artist.
2475 /// <p>
2476 /// }
2477 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Style)`</b>,
2478 /// \anchor MusicPlayer_Property_Artist_Style
2479 /// _string_,
2480 /// @return The styles of the currently playing artist.
2481 /// <p>
2482 /// }
2483 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Genre)`</b>,
2484 /// \anchor MusicPlayer_Property_Artist_Genre
2485 /// _string_,
2486 /// @return The genre of the currently playing artist.
2487 /// <p>
2488 /// }
2489 /// \table_row3{ <b>`MusicPlayer.Genre`</b>,
2490 /// \anchor MusicPlayer_Genre
2491 /// _string_,
2492 /// @return The genre(s) of current song.
2493 /// <p>
2494 /// }
2495 /// \table_row3{ <b>`MusicPlayer.offset(number).Genre`</b>,
2496 /// \anchor MusicPlayer_OffSet_Genre
2497 /// _string_,
2498 /// @return The genre(s) of the song with an offset `number` with respect
2499 /// to the current playing song.
2500 /// @param number - the offset song number with respect to the current playing
2501 /// song.
2502 /// <p>
2503 /// }
2504 /// \table_row3{ <b>`MusicPlayer.Position(number).Genre`</b>,
2505 /// \anchor MusicPlayer_Position_Genre
2506 /// _string_,
2507 /// @return The genre(s) of the song with an offset `number` with respect
2508 /// to the start of the playlist.
2509 /// @param number - the offset song number with respect to the start of the
2510 /// playlist
2511 /// song.
2512 /// <p>
2513 /// }
2514 /// \table_row3{ <b>`MusicPlayer.Lyrics`</b>,
2515 /// \anchor MusicPlayer_Lyrics
2516 /// _string_,
2517 /// @return The lyrics of current song stored in ID tag info.
2518 /// <p>
2519 /// }
2520 /// \table_row3{ <b>`MusicPlayer.Year`</b>,
2521 /// \anchor MusicPlayer_Year
2522 /// _string_,
2523 /// @return The year of release of current song.
2524 /// <p>
2525 /// }
2526 /// \table_row3{ <b>`MusicPlayer.offset(number).Year`</b>,
2527 /// \anchor MusicPlayer_Offset_Year
2528 /// _string_,
2529 /// @return The year of release of the song with an offset `number` with
2530 /// respect to the current playing song.
2531 /// @param number - the offset number with respect to the current song.
2532 /// <p>
2533 /// }
2534 /// \table_row3{ <b>`MusicPlayer.Position(number).Year`</b>,
2535 /// \anchor MusicPlayer_Position_Year
2536 /// _string_,
2537 /// @return The year of release of the song with an offset `number` with
2538 /// respect to the start of the playlist.
2539 /// @param number - the offset number with respect to the start of the
2540 /// playlist.
2541 /// <p>
2542 /// }
2543 /// \table_row3{ <b>`MusicPlayer.Rating`</b>,
2544 /// \anchor MusicPlayer_Rating
2545 /// _string_,
2546 /// @return The numeric Rating of current song (1-10).
2547 /// <p>
2548 /// }
2549 /// \table_row3{ <b>`MusicPlayer.offset(number).Rating`</b>,
2550 /// \anchor MusicPlayer_OffSet_Rating
2551 /// _string_,
2552 /// @return The numeric Rating of song with an offset `number` with
2553 /// respect to the current playing song.
2554 /// @param number - the offset with respect to the current playing song
2555 /// <p>
2556 /// }
2557 /// \table_row3{ <b>`MusicPlayer.Position(number).Rating`</b>,
2558 /// \anchor MusicPlayer_Position_Rating
2559 /// _string_,
2560 /// @return The numeric Rating of song with an offset `number` with
2561 /// respect to the start of the playlist.
2562 /// @param number - the offset with respect to the start of the playlist
2563 /// <p>
2564 /// }
2565 /// \table_row3{ <b>`MusicPlayer.RatingAndVotes`</b>,
2566 /// \anchor MusicPlayer_RatingAndVotes
2567 /// _string_,
2568 /// @return The scraped rating and votes of currently playing song\, if it's in the database.
2569 /// <p>
2570 /// }
2571 /// \table_row3{ <b>`MusicPlayer.UserRating`</b>,
2572 /// \anchor MusicPlayer_UserRating
2573 /// _string_,
2574 /// @return The scraped rating of the currently playing song (1-10).
2575 /// <p><hr>
2576 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_UserRating `MusicPlayer.UserRating`\endlink
2577 /// <p>
2578 /// }
2579 /// \table_row3{ <b>`MusicPlayer.Votes`</b>,
2580 /// \anchor MusicPlayer_Votes
2581 /// _string_,
2582 /// @return The scraped votes of currently playing song\, if it's in the database.
2583 /// <p>
2584 /// }
2585 /// \table_row3{ <b>`MusicPlayer.DiscNumber`</b>,
2586 /// \anchor MusicPlayer_DiscNumber
2587 /// _string_,
2588 /// @return The Disc Number of current song stored in ID tag info.
2589 /// <p>
2590 /// }
2591 /// \table_row3{ <b>`MusicPlayer.offset(number).DiscNumber`</b>,
2592 /// \anchor MusicPlayer_Offset_DiscNumber
2593 /// _string_,
2594 /// @return The Disc Number of current song stored in ID tag info for the
2595 /// song with an offset `number` with respect to the playing song.
2596 /// @param number - The offset value for the song with respect to the
2597 /// playing song.
2598 /// <p>
2599 /// }
2600 /// \table_row3{ <b>`MusicPlayer.Position(number).DiscNumber`</b>,
2601 /// \anchor MusicPlayer_Position_DiscNumber
2602 /// _string_,
2603 /// @return The Disc Number of current song stored in ID tag info for the
2604 /// song with an offset `number` with respect to the start of the playlist.
2605 /// @param number - The offset value for the song with respect to the
2606 /// start of the playlist.
2607 /// <p>
2608 /// }
2609 /// \table_row3{ <b>`MusicPlayer.Comment`</b>,
2610 /// \anchor MusicPlayer_Comment
2611 /// _string_,
2612 /// @return The Comment of current song stored in ID tag info.
2613 /// <p>
2614 /// }
2615 /// \table_row3{ <b>`MusicPlayer.offset(number).Comment`</b>,
2616 /// \anchor MusicPlayer_Offset_Comment
2617 /// _string_,
2618 /// @return The Comment of current song stored in ID tag info for the
2619 /// song with an offset `number` with respect to the playing song.
2620 /// @param number - The offset value for the song with respect to the
2621 /// playing song.
2622 /// <p>
2623 /// }
2624 /// \table_row3{ <b>`MusicPlayer.Position(number).Comment`</b>,
2625 /// \anchor MusicPlayer_Position_Comment
2626 /// _string_,
2627 /// @return The Comment of current song stored in ID tag info for the
2628 /// song with an offset `number` with respect to the start of the playlist.
2629 /// @param number - The offset value for the song with respect to the
2630 /// start of the playlist.
2631 /// <p>
2632 /// }
2633 /// \table_row3{ <b>`MusicPlayer.Contributors`</b>,
2634 /// \anchor MusicPlayer_Contributors
2635 /// _string_,
2636 /// @return The list of all people who've contributed to the currently playing song
2637 /// <p><hr>
2638 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Contributors `MusicPlayer.Contributors`\endlink
2639 /// <p>
2640 /// }
2641 /// \table_row3{ <b>`MusicPlayer.ContributorAndRole`</b>,
2642 /// \anchor MusicPlayer_ContributorAndRole
2643 /// _string_,
2644 /// @return The list of all people and their role who've contributed to the currently playing song.
2645 /// <p><hr>
2646 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_ContributorAndRole `MusicPlayer.ContributorAndRole`\endlink
2647 /// <p>
2648 /// }
2649 /// \table_row3{ <b>`MusicPlayer.Mood`</b>,
2650 /// \anchor MusicPlayer_Mood
2651 /// _string_,
2652 /// @return The mood of the currently playing song.
2653 /// <p><hr>
2654 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Mood `MusicPlayer.Mood`\endlink
2655 /// <p>
2656 /// }
2657 /// \table_row3{ <b>`MusicPlayer.PlaylistPlaying`</b>,
2658 /// \anchor MusicPlayer_PlaylistPlaying
2659 /// _boolean_,
2660 /// @return **True** if a playlist is currently playing.
2661 /// <p>
2662 /// }
2663 /// \table_row3{ <b>`MusicPlayer.Exists(relative\,position)`</b>,
2664 /// \anchor MusicPlayer_Exists
2665 /// _boolean_,
2666 /// @return **True** if the currently playing playlist has a song queued at the given position.
2667 /// @param relative - bool - If the position is relative
2668 /// @param position - int - The position of the song
2669 /// @note It is possible to define whether the position is relative or not\, default is false.
2670 /// <p>
2671 /// }
2672 /// \table_row3{ <b>`MusicPlayer.HasPrevious`</b>,
2673 /// \anchor MusicPlayer_HasPrevious
2674 /// _boolean_,
2675 /// @return **True** if the music player has a a Previous Song in the Playlist.
2676 /// <p>
2677 /// }
2678 /// \table_row3{ <b>`MusicPlayer.HasNext`</b>,
2679 /// \anchor MusicPlayer_HasNext
2680 /// _boolean_,
2681 /// @return **True** if the music player has a next song queued in the Playlist.
2682 /// <p>
2683 /// }
2684 /// \table_row3{ <b>`MusicPlayer.PlayCount`</b>,
2685 /// \anchor MusicPlayer_PlayCount
2686 /// _integer_,
2687 /// @return The play count of currently playing song\, if it's in the database.
2688 /// <p>
2689 /// }
2690 /// \table_row3{ <b>`MusicPlayer.LastPlayed`</b>,
2691 /// \anchor MusicPlayer_LastPlayed
2692 /// _string_,
2693 /// @return The last play date of currently playing song\, if it's in the database.
2694 /// <p>
2695 /// }
2696 /// \table_row3{ <b>`MusicPlayer.TrackNumber`</b>,
2697 /// \anchor MusicPlayer_TrackNumber
2698 /// _string_,
2699 /// @return The track number of current song.
2700 /// <p>
2701 /// }
2702 /// \table_row3{ <b>`MusicPlayer.offset(number).TrackNumber`</b>,
2703 /// \anchor MusicPlayer_Offset_TrackNumber
2704 /// _string_,
2705 /// @return The track number of the song with an offset `number`
2706 /// with respect to the current playing song.
2707 /// @param number - The offset number of the song with respect to the
2708 /// playing song
2709 /// <p>
2710 /// }
2711 /// \table_row3{ <b>`MusicPlayer.Position(number).TrackNumber`</b>,
2712 /// \anchor MusicPlayer_Position_TrackNumber
2713 /// _string_,
2714 /// @return The track number of the song with an offset `number`
2715 /// with respect to start of the playlist.
2716 /// @param number - The offset number of the song with respect
2717 /// to start of the playlist
2718 /// <p>
2719 /// }
2720 /// \table_row3{ <b>`MusicPlayer.Duration`</b>,
2721 /// \anchor MusicPlayer_Duration
2722 /// _string_,
2723 /// @return The duration of the current song.
2724 /// <p>
2725 /// }
2726 /// \table_row3{ <b>`MusicPlayer.offset(number).Duration`</b>,
2727 /// \anchor MusicPlayer_Offset_Duration
2728 /// _string_,
2729 /// @return The duration of the song with an offset `number`
2730 /// with respect to the current playing song.
2731 /// @param number - the offset number of the song with respect
2732 /// to the current playing song
2733 /// <p>
2734 /// }
2735 /// \table_row3{ <b>`MusicPlayer.Position(number).Duration`</b>,
2736 /// \anchor MusicPlayer_Position_Duration
2737 /// _string_,
2738 /// @return The duration of the song with an offset `number`
2739 /// with respect to the start of the playlist.
2740 /// @param number - the offset number of the song with respect
2741 /// to the start of the playlist
2742 /// <p>
2743 /// }
2744 /// \table_row3{ <b>`MusicPlayer.BitRate`</b>,
2745 /// \anchor MusicPlayer_BitRate
2746 /// _string_,
2747 /// @return The bitrate of current song.
2748 /// <p>
2749 /// }
2750 /// \table_row3{ <b>`MusicPlayer.Channels`</b>,
2751 /// \anchor MusicPlayer_Channels
2752 /// _string_,
2753 /// @return The number of channels of current song.
2754 /// <p>
2755 /// }
2756 /// \table_row3{ <b>`MusicPlayer.BitsPerSample`</b>,
2757 /// \anchor MusicPlayer_BitsPerSample
2758 /// _string_,
2759 /// @return The number of bits per sample of current song.
2760 /// <p>
2761 /// }
2762 /// \table_row3{ <b>`MusicPlayer.SampleRate`</b>,
2763 /// \anchor MusicPlayer_SampleRate
2764 /// _string_,
2765 /// @return The samplerate of current playing song.
2766 /// <p>
2767 /// }
2768 /// \table_row3{ <b>`MusicPlayer.Codec`</b>,
2769 /// \anchor MusicPlayer_Codec
2770 /// _string_,
2771 /// @return The codec of current playing song.
2772 /// <p>
2773 /// }
2774 /// \table_row3{ <b>`MusicPlayer.PlaylistPosition`</b>,
2775 /// \anchor MusicPlayer_PlaylistPosition
2776 /// _string_,
2777 /// @return The position of the current song in the current music playlist.
2778 /// <p>
2779 /// }
2780 /// \table_row3{ <b>`MusicPlayer.PlaylistLength`</b>,
2781 /// \anchor MusicPlayer_PlaylistLength
2782 /// _string_,
2783 /// @return The total size of the current music playlist.
2784 /// <p>
2785 /// }
2786 /// \table_row3{ <b>`MusicPlayer.ChannelName`</b>,
2787 /// \anchor MusicPlayer_ChannelName
2788 /// _string_,
2789 /// @return The channel name of the radio programme that's currently playing (PVR).
2790 /// <p>
2791 /// }
2792 /// \table_row3{ <b>`MusicPlayer.ChannelLogo`</b>,
2793 /// \anchor MusicPlayer_ChannelLogo
2794 /// _string_,
2795 /// @return The path for the logo of the currently playing radio channel\, if available (PVR).
2796 /// <p><hr>
2797 /// @skinning_v22 **[New Infolabel]** \link MusicPlayer_ChannelLogo `MusicPlayer.ChannelLogo`\endlink
2798 /// <p>
2799 /// }
2800 /// \table_row3{ <b>`MusicPlayer.ChannelNumberLabel`</b>,
2801 /// \anchor MusicPlayer_ChannelNumberLabel
2802 /// _string_,
2803 /// @return The channel and subchannel number of the radio channel that's currently
2804 /// playing (PVR).
2805 /// <p><hr>
2806 /// @skinning_v14 **[New Infolabel]** \link MusicPlayer_ChannelNumberLabel `MusicPlayer.ChannelNumberLabel`\endlink
2807 /// <p>
2808 /// }
2809 /// \table_row3{ <b>`MusicPlayer.ChannelGroup`</b>,
2810 /// \anchor MusicPlayer_ChannelGroup
2811 /// _string_,
2812 /// @return The channel group of the radio programme that's currently playing (PVR).
2813 /// <p>
2814 /// }
2815 /// \table_row3{ <b>`MusicPlayer.Property(propname)`</b>,
2816 /// \anchor MusicPlayer_Property_Propname
2817 /// _string_,
2818 /// @return The requested property value of the currently playing item.
2819 /// @param propname - The requested property
2820 /// <p>
2821 /// }
2822 /// \table_row3{ <b>`MusicPlayer.DBID`</b>,
2823 /// \anchor MusicPlayer_DBID
2824 /// _string_,
2825 /// @return The database id of the currently playing song.
2826 /// <p><hr>
2827 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_DBID `MusicPlayer.DBID`\endlink
2828 /// <p>
2829 /// }
2830 /// \table_row3{ <b>`MusicPlayer.DiscTitle`</b>,
2831 /// \anchor MusicPlayer_DiscTitle
2832 /// _string_,
2833 /// @return The title of the disc currently playing.
2834 /// <p><hr>
2835 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_DiscTitle `MusicPlayer.DiscTitle`\endlink
2836 /// <p>
2837 /// }
2838 /// \table_row3{ <b>`MusicPlayer.ReleaseDate`</b>,
2839 /// \anchor MusicPlayer_ReleaseDate
2840 /// _string_,
2841 /// @return The release date of the song currently playing.
2842 /// <p><hr>
2843 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_ReleaseDate `MusicPlayer.ReleaseDate`\endlink
2844 /// <p>
2845 /// }
2846 /// \table_row3{ <b>`MusicPlayer.OriginalDate`</b>,
2847 /// \anchor MusicPlayer_OriginalDate
2848 /// _string_,
2849 /// @return The original release date of the song currently playing.
2850 /// <p><hr>
2851 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_OriginalDate `MusicPlayer.OriginalDate`\endlink
2852 /// <p>
2853 /// }
2854 /// \table_row3{ <b>`MusicPlayer.BPM`</b>,
2855 /// \anchor MusicPlayer_BPM
2856 /// _string_,
2857 /// @return The bpm of the track currently playing.
2858 /// <p><hr>
2859 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_BPM `MusicPlayer.BPM`\endlink
2860 /// <p>
2861 /// }
2862 /// \table_row3{ <b>`MusicPlayer.IsMultiDisc`</b>,
2863 /// \anchor MusicPlayer_IsMultiDisc
2864 /// _boolean_,
2865 /// @return Returns **true** if the album currently playing has more than one disc.
2866 /// <p><hr>
2867 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_IsMultiDisc `MusicPlayer.IsMultiDisc`\endlink
2868 /// <p>
2869 /// }
2870 /// \table_row3{ <b>`MusicPlayer.TotalDiscs`</b>,
2871 /// \anchor MusicPlayer_TotalDiscs
2872 /// _string_,
2873 /// @return The number of discs associated with the currently playing album.
2874 /// <p><hr>
2875 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_TotalDiscs `MusicPlayer.TotalDiscs`\endlink
2876 /// <p>
2877 /// }
2878 /// \table_row3{ <b>`MusicPlayer.Station`</b>,
2879 /// \anchor MusicPlayer_Station
2880 /// _string_,
2881 /// @return The name of the radio station currently playing (if available).
2882 /// <p><hr>
2883 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_Station `MusicPlayer.Station`\endlink
2884 /// <p>
2885 /// }
2886 /// \table_end
2888 /// -----------------------------------------------------------------------------
2889 // clang-format off
2890 const infomap musicplayer[] = {{ "title", MUSICPLAYER_TITLE },
2891 { "album", MUSICPLAYER_ALBUM },
2892 { "artist", MUSICPLAYER_ARTIST },
2893 { "albumartist", MUSICPLAYER_ALBUM_ARTIST },
2894 { "year", MUSICPLAYER_YEAR },
2895 { "genre", MUSICPLAYER_GENRE },
2896 { "duration", MUSICPLAYER_DURATION },
2897 { "tracknumber", MUSICPLAYER_TRACK_NUMBER },
2898 { "cover", MUSICPLAYER_COVER },
2899 { "bitrate", MUSICPLAYER_BITRATE },
2900 { "playlistlength", MUSICPLAYER_PLAYLISTLEN },
2901 { "playlistposition", MUSICPLAYER_PLAYLISTPOS },
2902 { "channels", MUSICPLAYER_CHANNELS },
2903 { "bitspersample", MUSICPLAYER_BITSPERSAMPLE },
2904 { "samplerate", MUSICPLAYER_SAMPLERATE },
2905 { "codec", MUSICPLAYER_CODEC },
2906 { "discnumber", MUSICPLAYER_DISC_NUMBER },
2907 { "disctitle", MUSICPLAYER_DISC_TITLE },
2908 { "rating", MUSICPLAYER_RATING },
2909 { "ratingandvotes", MUSICPLAYER_RATING_AND_VOTES },
2910 { "userrating", MUSICPLAYER_USER_RATING },
2911 { "votes", MUSICPLAYER_VOTES },
2912 { "comment", MUSICPLAYER_COMMENT },
2913 { "mood", MUSICPLAYER_MOOD },
2914 { "contributors", MUSICPLAYER_CONTRIBUTORS },
2915 { "contributorandrole", MUSICPLAYER_CONTRIBUTOR_AND_ROLE },
2916 { "lyrics", MUSICPLAYER_LYRICS },
2917 { "playlistplaying", MUSICPLAYER_PLAYLISTPLAYING },
2918 { "exists", MUSICPLAYER_EXISTS },
2919 { "hasprevious", MUSICPLAYER_HASPREVIOUS },
2920 { "hasnext", MUSICPLAYER_HASNEXT },
2921 { "playcount", MUSICPLAYER_PLAYCOUNT },
2922 { "lastplayed", MUSICPLAYER_LASTPLAYED },
2923 { "channelname", MUSICPLAYER_CHANNEL_NAME },
2924 { "channellogo", MUSICPLAYER_CHANNEL_LOGO },
2925 { "channelnumberlabel", MUSICPLAYER_CHANNEL_NUMBER },
2926 { "channelgroup", MUSICPLAYER_CHANNEL_GROUP },
2927 { "dbid", MUSICPLAYER_DBID },
2928 { "property", MUSICPLAYER_PROPERTY },
2929 { "releasedate", MUSICPLAYER_RELEASEDATE },
2930 { "originaldate", MUSICPLAYER_ORIGINALDATE },
2931 { "bpm", MUSICPLAYER_BPM },
2932 { "ismultidisc", MUSICPLAYER_ISMULTIDISC },
2933 { "totaldiscs", MUSICPLAYER_TOTALDISCS },
2934 { "station", MUSICPLAYER_STATIONNAME }
2936 // clang-format on
2938 /// \page modules__infolabels_boolean_conditions
2939 /// \subsection modules__infolabels_boolean_conditions_Videoplayer Video player
2940 /// \table_start
2941 /// \table_h3{ Labels, Type, Description }
2942 /// \table_row3{ <b>`VideoPlayer.UsingOverlays`</b>,
2943 /// \anchor VideoPlayer_UsingOverlays
2944 /// _boolean_,
2945 /// @return **True** if the video player is using the hardware overlays render
2946 /// method.
2947 /// @note This is useful\, as with hardware overlays you have no alpha blending to
2948 /// the video image\, so shadows etc. need redoing\, or disabling.
2949 /// <p>
2950 /// }
2951 /// \table_row3{ <b>`VideoPlayer.IsFullscreen`</b>,
2952 /// \anchor VideoPlayer_IsFullscreen
2953 /// _boolean_,
2954 /// @return **True** if the video player is in fullscreen mode.
2955 /// <p>
2956 /// }
2957 /// \table_row3{ <b>`VideoPlayer.HasMenu`</b>,
2958 /// \anchor VideoPlayer_HasMenu
2959 /// _boolean_,
2960 /// @return **True** if the video player has a menu (ie is playing a DVD).
2961 /// <p>
2962 /// }
2963 /// \table_row3{ <b>`VideoPlayer.HasInfo`</b>,
2964 /// \anchor VideoPlayer_HasInfo
2965 /// _boolean_,
2966 /// @return **True** if the current playing video has information from the
2967 /// library or from a plugin (eg director/plot etc.)
2968 /// <p>
2969 /// }
2970 /// \table_row3{ <b>`VideoPlayer.HasVideoVersions`</b>,
2971 /// \anchor VideoPlayer_HasVideoVersions
2972 /// _boolean_,
2973 /// @return **True** when the played item has multiple video versions.
2974 /// <p><hr>
2975 /// @skinning_v21 **[New Infolabel]** \link VideoPlayer_HasVideoVersions `VideoPlayer.HasVideoVersions`\endlink
2976 /// }
2977 /// \table_row3{ <b>`VideoPlayer.Content(parameter)`</b>,
2978 /// \anchor VideoPlayer_Content
2979 /// _boolean_,
2980 /// @return **True** if the current Video you are playing is contained in
2981 /// corresponding Video Library sections. The following values are accepted:
2982 /// - <b>files</b>
2983 /// - <b>movies</b>
2984 /// - <b>episodes</b>
2985 /// - <b>musicvideos</b>
2986 /// - <b>livetv</b>
2987 /// <p>
2988 /// }
2989 /// \table_row3{ <b>`VideoPlayer.HasSubtitles`</b>,
2990 /// \anchor VideoPlayer_HasSubtitles
2991 /// _boolean_,
2992 /// @return **True** if there are subtitles available for video.
2993 /// <p>
2994 /// }
2995 /// \table_row3{ <b>`VideoPlayer.HasTeletext`</b>,
2996 /// \anchor VideoPlayer_HasTeletext
2997 /// _boolean_,
2998 /// @return **True** if teletext is usable on played TV channel.
2999 /// <p>
3000 /// }
3001 /// \table_row3{ <b>`VideoPlayer.IsStereoscopic`</b>,
3002 /// \anchor VideoPlayer_IsStereoscopic
3003 /// _boolean_,
3004 /// @return **True** when the currently playing video is a 3D (stereoscopic)
3005 /// video.
3006 /// <p><hr>
3007 /// @skinning_v13 **[New Boolean Condition]** \link VideoPlayer_IsStereoscopic `VideoPlayer.IsStereoscopic`\endlink
3008 /// <p>
3009 /// }
3010 /// \table_row3{ <b>`VideoPlayer.SubtitlesEnabled`</b>,
3011 /// \anchor VideoPlayer_SubtitlesEnabled
3012 /// _boolean_,
3013 /// @return **True** if subtitles are turned on for video.
3014 /// <p>
3015 /// }
3016 /// \table_row3{ <b>`VideoPlayer.HasEpg`</b>,
3017 /// \anchor VideoPlayer_HasEpg
3018 /// _boolean_,
3019 /// @return **True** if epg information is available for the currently playing
3020 /// programme (PVR).
3021 /// <p>
3022 /// }
3023 /// \table_row3{ <b>`VideoPlayer.CanResumeLiveTV`</b>,
3024 /// \anchor VideoPlayer_CanResumeLiveTV
3025 /// _boolean_,
3026 /// @return **True** if a in-progress PVR recording is playing an the respective
3027 /// live TV channel is available.
3028 /// <p>
3029 /// }
3030 /// \table_row3{ <b>`VideoPlayer.Title`</b>,
3031 /// \anchor VideoPlayer_Title
3032 /// _string_,
3033 /// @return The title of currently playing video.
3034 /// @note If it's in the database it will return the database title\, else the filename.
3035 /// <p>
3036 /// }
3037 /// \table_row3{ <b>`VideoPlayer.offset(number).Title`</b>,
3038 /// \anchor VideoPlayer_Offset_Title
3039 /// _string_,
3040 /// @return The title of video which has an offset `number` with respect to the currently playing video.
3041 /// @note If it's in the database it will return the database title\, else the filename.
3042 /// <p><hr>
3043 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Title `VideoPlayer.offset(number).Title`\endlink
3044 /// <p>
3045 /// }
3046 /// \table_row3{ <b>`VideoPlayer.position(number).Title`</b>,
3047 /// \anchor VideoPlayer_Position_Title
3048 /// _string_,
3049 /// @return The title of the video which has an offset `number` with respect to the start of the playlist.
3050 /// @note If it's in the database it will return the database title\, else the filename.
3051 /// <p><hr>
3052 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Title `VideoPlayer.position(number).Title`\endlink
3053 /// <p>
3054 /// }
3055 /// \table_row3{ <b>`VideoPlayer.OriginalTitle`</b>,
3056 /// \anchor VideoPlayer_OriginalTitle
3057 /// _string_,
3058 /// @return The original title of currently playing video. If it's in the database.
3059 /// <p>
3060 /// }
3061 /// \table_row3{ <b>`VideoPlayer.offset(number).OriginalTitle`</b>,
3062 /// \anchor VideoPlayer_Offset_OriginalTitle
3063 /// _string_,
3064 /// @return The original title of the video which has an offset `number` with respect to the currently playing video.
3065 /// <p><hr>
3066 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_OriginalTitle `VideoPlayer.offset(number).OriginalTitle`\endlink
3067 /// <p>
3068 /// }
3069 /// \table_row3{ <b>`VideoPlayer.position(number).OriginalTitle`</b>,
3070 /// \anchor VideoPlayer_Position_OriginalTitle
3071 /// _string_,
3072 /// @return The original title of the video which has an offset `number` with respect to the start of the playlist.
3073 /// <p><hr>
3074 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_OriginalTitle `VideoPlayer.position(number).OriginalTitle`\endlink
3075 /// <p>
3076 /// }
3077 /// \table_row3{ <b>`VideoPlayer.TVShowTitle`</b>,
3078 /// \anchor VideoPlayer_TVShowTitle
3079 /// _string_,
3080 /// @return The title of currently playing episode's tvshow name.
3081 /// <p>
3082 /// }
3083 /// \table_row3{ <b>`VideoPlayer.offset(number).TVShowTitle`</b>,
3084 /// \anchor VideoPlayer_Offset_TVShowTitle
3085 /// _string_,
3086 /// @return The title of the episode's tvshow name which has an offset `number` with respect to the currently playing video.
3087 /// <p><hr>
3088 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_TVShowTitle `VideoPlayer.offset(number).TVShowTitle`\endlink
3089 /// <p>
3090 /// }
3091 /// \table_row3{ <b>`VideoPlayer.position(number).TVShowTitle`</b>,
3092 /// \anchor VideoPlayer_Position_TVShowTitle
3093 /// _string_,
3094 /// @return The title of the episode's tvshow name which has an offset `number` with respect to the start of the playlist.
3095 /// <p><hr>
3096 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_TVShowTitle `VideoPlayer.position(number).TVShowTitle`\endlink
3097 /// <p>
3098 /// }
3099 /// \table_row3{ <b>`VideoPlayer.Season`</b>,
3100 /// \anchor VideoPlayer_Season
3101 /// _string_,
3102 /// @return The season number of the currently playing episode\, if it's in the database.
3103 /// <p><hr>
3104 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Season `VideoPlayer.Season`\endlink
3105 /// also supports EPG.
3106 /// <p>
3107 /// }
3108 /// \table_row3{ <b>`VideoPlayer.offset(number).Season`</b>,
3109 /// \anchor VideoPlayer_Offset_Season
3110 /// _string_,
3111 /// @return The season number of the episode which has an offset `number` with respect to the currently playing video.
3112 /// <p><hr>
3113 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Season `VideoPlayer.offset(number).Season`\endlink
3114 /// <p>
3115 /// }
3116 /// \table_row3{ <b>`VideoPlayer.position(number).Season`</b>,
3117 /// \anchor VideoPlayer_Position_Season
3118 /// _string_,
3119 /// @return The season number of the episode which has an offset `number` with respect to the start of the playlist.
3120 /// <p><hr>
3121 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Season `VideoPlayer.position(number).Season`\endlink
3122 /// <p>
3123 /// }
3124 /// \table_row3{ <b>`VideoPlayer.Episode`</b>,
3125 /// \anchor VideoPlayer_Episode
3126 /// _string_,
3127 /// @return The episode number of the currently playing episode.
3128 /// <p><hr>
3129 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Episode `VideoPlayer.Episode`\endlink
3130 /// also supports EPG.
3131 /// <p>
3132 /// }
3133 /// \table_row3{ <b>`VideoPlayer.offset(number).Episode`</b>,
3134 /// \anchor VideoPlayer_Offset_Episode
3135 /// _string_,
3136 /// @return The episode number of the episode which has an offset `number` with respect to the currently playing video.
3137 /// <p><hr>
3138 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Episode `VideoPlayer.offset(number).Episode`\endlink
3139 /// <p>
3140 /// }
3141 /// \table_row3{ <b>`VideoPlayer.position(number).Episode`</b>,
3142 /// \anchor VideoPlayer_Position_Episode
3143 /// _string_,
3144 /// @return The episode number of the episode which has an offset `number` with respect to the start of the playlist.
3145 /// <p><hr>
3146 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Episode `VideoPlayer.position(number).Episode`\endlink
3147 /// <p>
3148 /// }
3149 /// \table_row3{ <b>`VideoPlayer.Genre`</b>,
3150 /// \anchor VideoPlayer_Genre
3151 /// _string_,
3152 /// @return The genre(s) of current movie\, if it's in the database.
3153 /// <p>
3154 /// }
3155 /// \table_row3{ <b>`VideoPlayer.offset(number).Genre`</b>,
3156 /// \anchor VideoPlayer_Offset_Genre
3157 /// _string_,
3158 /// @return The genre(s) of the video which has an offset `number` with respect to the currently playing video.
3159 /// <p><hr>
3160 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Genre `VideoPlayer.offset(number).Genre`\endlink
3161 /// <p>
3162 /// }
3163 /// \table_row3{ <b>`VideoPlayer.position(number).Genre`</b>,
3164 /// \anchor VideoPlayer_Position_Genre
3165 /// _string_,
3166 /// @return The genre(s) of the video which has an offset `number` with respect to the start of the playlist.
3167 /// <p><hr>
3168 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Genre `VideoPlayer.position(number).Genre`\endlink
3169 /// <p>
3170 /// }
3171 /// \table_row3{ <b>`VideoPlayer.Director`</b>,
3172 /// \anchor VideoPlayer_Director
3173 /// _string_,
3174 /// @return The director of current movie\, if it's in the database.
3175 /// <p><hr>
3176 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Director `VideoPlayer.Director`\endlink
3177 /// also supports EPG.
3178 /// <p>
3179 /// }
3180 /// \table_row3{ <b>`VideoPlayer.offset(number).Director`</b>,
3181 /// \anchor VideoPlayer_Offset_Director
3182 /// _string_,
3183 /// @return The director of the video which has an offset `number` with respect to the currently playing video.
3184 /// <p><hr>
3185 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Director `VideoPlayer.offset(number).VideoPlayer_Offset_Director`\endlink
3186 /// <p>
3187 /// }
3188 /// \table_row3{ <b>`VideoPlayer.position(number).Director`</b>,
3189 /// \anchor VideoPlayer_Position_Director
3190 /// _string_,
3191 /// @return The director of the video which has an offset `number` with respect to the start of the playlist.
3192 /// <p><hr>
3193 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Director `VideoPlayer.position(number).Director`\endlink
3194 /// <p>
3195 /// }
3196 /// \table_row3{ <b>`VideoPlayer.Country`</b>,
3197 /// \anchor VideoPlayer_Country
3198 /// _string_,
3199 /// @return The production country of current movie\, if it's in the database.
3200 /// <p>
3201 /// }
3202 /// \table_row3{ <b>`VideoPlayer.offset(number).Country`</b>,
3203 /// \anchor VideoPlayer_Offset_Country
3204 /// _string_,
3205 /// @return The production country of the video which has an offset `number` with respect to the currently playing video.
3206 /// <p><hr>
3207 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Country `VideoPlayer.offset(number).Country`\endlink
3208 /// <p>
3209 /// }
3210 /// \table_row3{ <b>`VideoPlayer.position(number).Country`</b>,
3211 /// \anchor VideoPlayer_Position_Country
3212 /// _string_,
3213 /// @return The production country of the video which has an offset `number` with respect to the start of the playlist.
3214 /// <p><hr>
3215 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Country `VideoPlayer.position(number).Country`\endlink
3216 /// <p>
3217 /// }
3218 /// \table_row3{ <b>`VideoPlayer.Year`</b>,
3219 /// \anchor VideoPlayer_Year
3220 /// _string_,
3221 /// @return The year of release of current movie\, if it's in the database.
3222 /// <p>
3223 /// }
3224 /// \table_row3{ <b>`VideoPlayer.offset(number).Year`</b>,
3225 /// \anchor VideoPlayer_Offset_Year
3226 /// _string_,
3227 /// @return The year of release of the video which has an offset `number` with respect to the currently playing video.
3228 /// <p><hr>
3229 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Year `VideoPlayer.offset(number).Year`\endlink
3230 /// <p>
3231 /// }
3232 /// \table_row3{ <b>`VideoPlayer.position(number).Year`</b>,
3233 /// \anchor VideoPlayer_Position_Year
3234 /// _string_,
3235 /// @return The year of release of the video which has an offset `number` with respect to the start of the playlist.
3236 /// <p><hr>
3237 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Year `VideoPlayer.position(number).Year`\endlink
3238 /// <p>
3239 /// }
3240 /// \table_row3{ <b>`VideoPlayer.Cover`</b>,
3241 /// \anchor VideoPlayer_Cover
3242 /// _string_,
3243 /// @return The cover of currently playing movie.
3244 /// <p>
3245 /// }
3246 /// \table_row3{ <b>`VideoPlayer.offset(number).Cover`</b>,
3247 /// \anchor VideoPlayer_Offset_Cover
3248 /// _string_,
3249 /// @return The cover of the video which has an offset `number` with respect to the currently playing video.
3250 /// <p><hr>
3251 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Cover `VideoPlayer.offset(number).Cover`\endlink
3252 /// <p>
3253 /// }
3254 /// \table_row3{ <b>`VideoPlayer.position(number).Cover`</b>,
3255 /// \anchor VideoPlayer_Position_Cover
3256 /// _string_,
3257 /// @return The cover of the video which has an offset `number` with respect to the start of the playlist.
3258 /// <p><hr>
3259 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Cover `VideoPlayer.position(number).Cover`\endlink
3260 /// <p>
3261 /// }
3262 /// \table_row3{ <b>`VideoPlayer.Rating`</b>,
3263 /// \anchor VideoPlayer_Rating
3264 /// _string_,
3265 /// @return The scraped rating of current movie\, if it's in the database.
3266 /// <p>
3267 /// }
3268 /// \table_row3{ <b>`VideoPlayer.offset(number).Rating`</b>,
3269 /// \anchor VideoPlayer_Offset_Rating
3270 /// _string_,
3271 /// @return The scraped rating of the video which has an offset `number` with respect to the currently playing video.
3272 /// <p><hr>
3273 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Rating `VideoPlayer.offset(number).Rating`\endlink
3274 /// <p>
3275 /// }
3276 /// \table_row3{ <b>`VideoPlayer.position(number).Rating`</b>,
3277 /// \anchor VideoPlayer_Position_Rating
3278 /// _string_,
3279 /// @return The scraped rating of the video which has an offset `number` with respect to the start of the playlist.
3280 /// <p><hr>
3281 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Rating `VideoPlayer.position(number).Rating`\endlink
3282 /// <p>
3283 /// }
3284 /// \table_row3{ <b>`VideoPlayer.UserRating`</b>,
3285 /// \anchor VideoPlayer_UserRating
3286 /// _string_,
3287 /// @return The user rating of the currently playing item.
3288 /// <p><hr>
3289 /// @skinning_v16 **[New Infolabel]** \link VideoPlayer_UserRating `VideoPlayer.UserRating`\endlink
3290 /// <p>
3291 /// }
3292 /// \table_row3{ <b>`VideoPlayer.offset(number).UserRating`</b>,
3293 /// \anchor VideoPlayer_Offset_UserRating
3294 /// _string_,
3295 /// @return The user rating of the video which has an offset `number` with respect to the currently playing video.
3296 /// <p><hr>
3297 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_UserRating `VideoPlayer.offset(number).UserRating`\endlink
3298 /// <p>
3299 /// }
3300 /// \table_row3{ <b>`VideoPlayer.position(number).UserRating`</b>,
3301 /// \anchor VideoPlayer_Position_UserRating
3302 /// _string_,
3303 /// @return The user rating of the video which has an offset `number` with respect to the start of the playlist.
3304 /// <p><hr>
3305 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_UserRating `VideoPlayer.position(number).UserRating`\endlink
3306 /// <p>
3307 /// }
3308 /// \table_row3{ <b>`VideoPlayer.Votes`</b>,
3309 /// \anchor VideoPlayer_Votes
3310 /// _string_,
3311 /// @return The scraped votes of current movie\, if it's in the database.
3312 /// <p><hr>
3313 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_Votes `VideoPlayer.Votes`\endlink
3314 /// <p>
3315 /// }
3316 /// \table_row3{ <b>`VideoPlayer.offset(number).Votes`</b>,
3317 /// \anchor VideoPlayer_Offset_Votes
3318 /// _string_,
3319 /// @return The scraped votes of the video which has an offset `number` with respect to the currently playing video.
3320 /// <p><hr>
3321 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Votes `VideoPlayer.offset(number).Votes`\endlink
3322 /// <p>
3323 /// }
3324 /// \table_row3{ <b>`VideoPlayer.position(number).Votes`</b>,
3325 /// \anchor VideoPlayer_Position_Votes
3326 /// _string_,
3327 /// @return The scraped votes of the video which has an offset `number` with respect to the start of the playlist.
3328 /// <p><hr>
3329 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Votes `VideoPlayer.position(number).Votes`\endlink
3330 /// <p>
3331 /// }
3332 /// \table_row3{ <b>`VideoPlayer.RatingAndVotes`</b>,
3333 /// \anchor VideoPlayer_RatingAndVotes
3334 /// _string_,
3335 /// @return The scraped rating and votes of current movie\, if it's in the database
3336 /// <p>
3337 /// }
3338 /// \table_row3{ <b>`VideoPlayer.offset(number).RatingAndVotes`</b>,
3339 /// \anchor VideoPlayer_Offset_RatingAndVotes
3340 /// _string_,
3341 /// @return The scraped rating and votes of the video which has an offset `number` with respect to the currently playing video.
3342 /// <p><hr>
3343 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_RatingAndVotes `VideoPlayer.offset(number).RatingAndVotes`\endlink
3344 /// <p>
3345 /// }
3346 /// \table_row3{ <b>`VideoPlayer.position(number).RatingAndVotes`</b>,
3347 /// \anchor VideoPlayer_Position_RatingAndVotes
3348 /// _string_,
3349 /// @return The scraped rating and votes of the video which has an offset `number` with respect to the start of the playlist.
3350 /// <p><hr>
3351 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_RatingAndVotes `VideoPlayer.position(number).RatingAndVotes`\endlink
3352 /// <p>
3353 /// }
3354 /// \table_row3{ <b>`VideoPlayer.mpaa`</b>,
3355 /// \anchor VideoPlayer_mpaa
3356 /// _string_,
3357 /// @return The MPAA rating of current movie\, if it's in the database.
3358 /// <p>
3359 /// }
3360 /// \table_row3{ <b>`VideoPlayer.offset(number).mpaa`</b>,
3361 /// \anchor VideoPlayer_Offset_mpaa
3362 /// _string_,
3363 /// @return The MPAA rating of the video which has an offset `number` with respect to the currently playing video.
3364 /// <p><hr>
3365 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_mpaa `VideoPlayer.offset(number).mpaa`\endlink
3366 /// <p>
3367 /// }
3368 /// \table_row3{ <b>`VideoPlayer.position(number).mpaa`</b>,
3369 /// \anchor VideoPlayer_Position_mpaa
3370 /// _string_,
3371 /// @return The MPAA rating of the video which has an offset `number` with respect to the start of the playlist.
3372 /// <p><hr>
3373 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_mpaa `VideoPlayer.position(number).mpaa`\endlink
3374 /// <p>
3375 /// }
3376 /// \table_row3{ <b>`VideoPlayer.Art(type)`</b>,
3377 /// \anchor VideoPlayer_art
3378 /// _string_,
3379 /// @return The art path for the requested arttype and for the currently playing video.
3380 /// @param type - can virtually be anything\, refers to the art type keyword in the art map (poster\, fanart\, banner\, thumb\, etc)
3381 /// <p><hr>
3382 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_art `VideoPlayer.Art(type)`\endlink
3383 /// <p>
3384 /// }
3385 /// \table_row3{ <b>`VideoPlayer.offset(number).Art(type)`</b>,
3386 /// \anchor VideoPlayer_Offset_art
3387 /// _string_,
3388 /// @return The art path for the requested arttype and for the video which has an offset `number` with respect to the currently playing video.
3389 /// @param number - the offset with respect to the start of the playlist
3390 /// @param type - can virtually be anything\, refers to the art type keyword in the art map (poster\, fanart\, banner\, thumb\, etc)
3391 /// <p><hr>
3392 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_Offset_mpaa `VideoPlayer.offset(number).Art(type)`\endlink
3393 /// <p>
3394 /// }
3395 /// \table_row3{ <b>`VideoPlayer.position(number).Art(type)`</b>,
3396 /// \anchor VideoPlayer_position_art
3397 /// _string_,
3398 /// @return The art path for the requested arttype and for the video which has an offset `number` with respect to the start of the playlist.
3399 /// @param number - the offset with respect to the start of the playlist
3400 /// @param type - can virtually be anything\, refers to the art type keyword in the art map (poster\, fanart\, banner\, thumb\, etc)
3401 /// <p><hr>
3402 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_position_art `VideoPlayer.position(number).Art(type)`\endlink
3403 /// <p>
3404 /// }
3405 /// \table_row3{ <b>`VideoPlayer.IMDBNumber`</b>,
3406 /// \anchor VideoPlayer_IMDBNumber
3407 /// _string_,
3408 /// @return The IMDb ID of the current movie\, if it's in the database.
3409 /// <p><hr>
3410 /// @skinning_v15 **[New Infolabel]** \link VideoPlayer_IMDBNumber `VideoPlayer.IMDBNumber`\endlink
3411 /// <p>
3412 /// }
3413 /// \table_row3{ <b>`VideoPlayer.offset(number).IMDBNumber`</b>,
3414 /// \anchor VideoPlayer_Offset_IMDBNumber
3415 /// _string_,
3416 /// @return The IMDb ID of the the video which has an offset `number` with respect to the currently playing video.
3417 /// <p><hr>
3418 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_IMDBNumber `VideoPlayer.offset(number).IMDBNumber`\endlink
3419 /// <p>
3420 /// }
3421 /// \table_row3{ <b>`VideoPlayer.position(number).IMDBNumber`</b>,
3422 /// \anchor VideoPlayer_Position_IMDBNumber
3423 /// _string_,
3424 /// @return The IMDb ID of the video which has an offset `number` with respect to the start of the playlist.
3425 /// <p><hr>
3426 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_IMDBNumber `VideoPlayer.position(number).IMDBNumber`\endlink
3427 /// <p>
3428 /// }
3429 /// \table_row3{ <b>`VideoPlayer.Top250`</b>,
3430 /// \anchor VideoPlayer_Top250
3431 /// _string_,
3432 /// @return The IMDb Top250 position of the currently playing movie\, if it's in the database.
3433 /// <p>
3434 /// }
3435 /// \table_row3{ <b>`VideoPlayer.offset(number).Top250`</b>,
3436 /// \anchor VideoPlayer_Offset_Top250
3437 /// _string_,
3438 /// @return The IMDb Top250 position of the video which has an offset `number` with respect to the currently playing video.
3439 /// <p><hr>
3440 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Top250 `VideoPlayer.offset(number).Top250`\endlink
3441 /// <p>
3442 /// }
3443 /// \table_row3{ <b>`VideoPlayer.position(number).Top250`</b>,
3444 /// \anchor VideoPlayer_Position_Top250
3445 /// _string_,
3446 /// @return The IMDb Top250 position of the video which has an offset `number` with respect to the start of the playlist.
3447 /// <p><hr>
3448 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Top250 `VideoPlayer.position(number).Top250`\endlink
3449 /// <p>
3450 /// }
3451 /// \table_row3{ <b>`VideoPlayer.EpisodeName`</b>,
3452 /// \anchor VideoPlayer_EpisodeName
3453 /// _string_,
3454 /// @return The name of the episode if the playing video is a TV Show\,
3455 /// if it's in the database (PVR).
3456 /// <p><hr>
3457 /// @skinning_v15 **[New Infolabel]** \link VideoPlayer_EpisodeName `VideoPlayer.EpisodeName`\endlink
3458 /// <p>
3459 /// }
3460 /// \table_row3{ <b>`VideoPlayer.PlaylistPosition`</b>,
3461 /// \anchor VideoPlayer_PlaylistPosition
3462 /// _string_,
3463 /// @return The position of the current song in the current video playlist.
3464 /// <p>
3465 /// }
3466 /// \table_row3{ <b>`VideoPlayer.PlaylistLength`</b>,
3467 /// \anchor VideoPlayer_PlaylistLength
3468 /// _string_,
3469 /// @return The total size of the current video playlist.
3470 /// <p>
3471 /// }
3472 /// \table_row3{ <b>`VideoPlayer.Cast`</b>,
3473 /// \anchor VideoPlayer_Cast
3474 /// _string_,
3475 /// @return A list of cast members\, separated by carriage returns.
3476 /// <p><hr>
3477 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Cast `VideoPlayer.Cast`\endlink
3478 /// also supports EPG.
3479 /// <p>
3480 /// }
3481 /// \table_row3{ <b>`VideoPlayer.CastAndRole`</b>,
3482 /// \anchor VideoPlayer_CastAndRole
3483 /// _string_,
3484 /// @return A list of cast members and roles\, separated by carriage
3485 /// returns. Every cast/role combination is formatted 'cast' as 'role' where 'as' is localised.
3486 /// <p>
3487 /// }
3488 /// \table_row3{ <b>`VideoPlayer.Album`</b>,
3489 /// \anchor VideoPlayer_Album
3490 /// _string_,
3491 /// @return The album from which the current Music Video is from\, if it's in the database.
3492 /// <p>
3493 /// }
3494 /// \table_row3{ <b>`VideoPlayer.offset(number).Album`</b>,
3495 /// \anchor VideoPlayer_Offset_Album
3496 /// _string_,
3497 /// @return The album from which the video which has an offset `number` with respect to the currently playing video.
3498 /// <p><hr>
3499 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Album `VideoPlayer.offset(number).Album`\endlink
3500 /// <p>
3501 /// }
3502 /// \table_row3{ <b>`VideoPlayer.position(number).Album`</b>,
3503 /// \anchor VideoPlayer_Position_Album
3504 /// _string_,
3505 /// @return The album from which the music video which has an offset `number` with respect to the start of the playlist.
3506 /// <p><hr>
3507 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Album `VideoPlayer.position(number).Album`\endlink
3508 /// <p>
3509 /// }
3510 /// \table_row3{ <b>`VideoPlayer.Artist`</b>,
3511 /// \anchor VideoPlayer_Artist
3512 /// _string_,
3513 /// @return The artist(s) of current Music Video\, if it's in the database.
3514 /// <p>
3515 /// }
3516 /// \table_row3{ <b>`VideoPlayer.offset(number).Artist`</b>,
3517 /// \anchor VideoPlayer_Offset_Artist
3518 /// _string_,
3519 /// @return The artist(s) of the video which has an offset `number` with respect to the currently playing video.
3520 /// <p><hr>
3521 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Artist `VideoPlayer.offset(number).Artist`\endlink
3522 /// <p>
3523 /// }
3524 /// \table_row3{ <b>`VideoPlayer.position(number).Artist`</b>,
3525 /// \anchor VideoPlayer_Position_Artist
3526 /// _string_,
3527 /// @return The artist(s) of the music video which has an offset `number` with respect to the start of the playlist.
3528 /// <p><hr>
3529 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Artist `VideoPlayer.position(number).Artist`\endlink
3530 /// <p>
3531 /// }
3532 /// \table_row3{ <b>`VideoPlayer.Studio`</b>,
3533 /// \anchor VideoPlayer_Studio
3534 /// _string_,
3535 /// @return The studio of current Music Video\, if it's in the database.
3536 /// <p>
3537 /// }
3538 /// \table_row3{ <b>`VideoPlayer.offset(number).Studio`</b>,
3539 /// \anchor VideoPlayer_Offset_Studio
3540 /// _string_,
3541 /// @return The studio of the video which has an offset `number` with respect to the currently playing video.
3542 /// <p><hr>
3543 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Studio `VideoPlayer.offset(number).Studio`\endlink
3544 /// <p>
3545 /// }
3546 /// \table_row3{ <b>`VideoPlayer.position(number).Studio`</b>,
3547 /// \anchor VideoPlayer_Position_Studio
3548 /// _string_,
3549 /// @return The studio of the video which has an offset `number` with respect to the start of the playlist.
3550 /// <p><hr>
3551 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Studio `VideoPlayer.position(number).Studio`\endlink
3552 /// <p>
3553 /// }
3554 /// \table_row3{ <b>`VideoPlayer.Writer`</b>,
3555 /// \anchor VideoPlayer_Writer
3556 /// _string_,
3557 /// @return The name of Writer of current playing Video\, if it's in the database.
3558 /// <p><hr>
3559 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Writer `VideoPlayer.Writer`\endlink
3560 /// also supports EPG.
3561 /// <p>
3562 /// }
3563 /// \table_row3{ <b>`VideoPlayer.offset(number).Writer`</b>,
3564 /// \anchor VideoPlayer_Offset_Writer
3565 /// _string_,
3566 /// @return The name of Writer of the video which has an offset `number` with respect to the currently playing video.
3567 /// <p><hr>
3568 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Writer `VideoPlayer.offset(number).Writer`\endlink
3569 /// <p>
3570 /// }
3571 /// \table_row3{ <b>`VideoPlayer.position(number).Writer`</b>,
3572 /// \anchor VideoPlayer_Position_Writer
3573 /// _string_,
3574 /// @return The name of Writer of the video which has an offset `number` with respect to the start of the playlist.
3575 /// <p><hr>
3576 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Writer `VideoPlayer.position(number).Writer`\endlink
3577 /// <p>
3578 /// }
3579 /// \table_row3{ <b>`VideoPlayer.Tagline`</b>,
3580 /// \anchor VideoPlayer_Tagline
3581 /// _string_,
3582 /// @return The small Summary of current playing Video\, if it's in the database.
3583 /// <p>
3584 /// }
3585 /// \table_row3{ <b>`VideoPlayer.offset(number).Tagline`</b>,
3586 /// \anchor VideoPlayer_Offset_Tagline
3587 /// _string_,
3588 /// @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3589 /// <p><hr>
3590 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Tagline `VideoPlayer.offset(number).Tagline`\endlink
3591 /// <p>
3592 /// }
3593 /// \table_row3{ <b>`VideoPlayer.position(number).Tagline`</b>,
3594 /// \anchor VideoPlayer_Position_Tagline
3595 /// _string_,
3596 /// @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3597 /// <p><hr>
3598 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Tagline `VideoPlayer.position(number).Tagline`\endlink
3599 /// <p>
3600 /// }
3601 /// \table_row3{ <b>`VideoPlayer.PlotOutline`</b>,
3602 /// \anchor VideoPlayer_PlotOutline
3603 /// _string_,
3604 /// @return The small Summary of current playing Video\, if it's in the database.
3605 /// <p>
3606 /// }
3607 /// \table_row3{ <b>`VideoPlayer.offset(number).PlotOutline`</b>,
3608 /// \anchor VideoPlayer_Offset_PlotOutline
3609 /// _string_,
3610 /// @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3611 /// <p><hr>
3612 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlotOutline `VideoPlayer.offset(number).PlotOutline`\endlink
3613 /// <p>
3614 /// }
3615 /// \table_row3{ <b>`VideoPlayer.position(number).PlotOutline`</b>,
3616 /// \anchor VideoPlayer_Position_PlotOutline
3617 /// _string_,
3618 /// @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3619 /// <p><hr>
3620 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlotOutline `VideoPlayer.position(number).PlotOutline`\endlink
3621 /// <p>
3622 /// }
3623 /// \table_row3{ <b>`VideoPlayer.Plot`</b>,
3624 /// \anchor VideoPlayer_Plot
3625 /// _string_,
3626 /// @return The complete Text Summary of current playing Video\, if it's in the database.
3627 /// <p>
3628 /// }
3629 /// \table_row3{ <b>`VideoPlayer.offset(number).Plot`</b>,
3630 /// \anchor VideoPlayer_Offset_Plot
3631 /// _string_,
3632 /// @return The complete Text Summary of the video which has an offset `number` with respect to the currently playing video.
3633 /// <p><hr>
3634 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Plot `VideoPlayer.offset(number).Plot`\endlink
3635 /// <p>
3636 /// }
3637 /// \table_row3{ <b>`VideoPlayer.position(number).Plot`</b>,
3638 /// \anchor VideoPlayer_Position_Plot
3639 /// _string_,
3640 /// @return The complete Text Summary of the video which has an offset `number` with respect to the start of the playlist.
3641 /// <p><hr>
3642 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Plot `VideoPlayer.position(number).Plot`\endlink
3643 /// <p>
3644 /// }
3645 /// \table_row3{ <b>`VideoPlayer.Premiered`</b>,
3646 /// \anchor VideoPlayer_Premiered
3647 /// _string_,
3648 /// @return The release or aired date of the currently playing episode\, show\, movie or EPG item\,
3649 /// if it's in the database.
3650 /// <p>
3651 /// }
3652 /// \table_row3{ <b>`VideoPlayer.offset(number).Premiered`</b>,
3653 /// \anchor VideoPlayer_Offset_Premiered
3654 /// _string_,
3655 /// @return The release or aired date of the video which has an offset `number` with respect to the currently playing video.
3656 /// <p><hr>
3657 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Premiered `VideoPlayer.offset(number).Premiered`\endlink
3658 /// <p>
3659 /// }
3660 /// \table_row3{ <b>`VideoPlayer.position(number).Premiered`</b>,
3661 /// \anchor VideoPlayer_Position_Premiered
3662 /// _string_,
3663 /// @return The release or aired date of the video which has an offset `number` with respect to the start of the playlist.
3664 /// if it's in the database.
3665 /// <p><hr>
3666 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Premiered `VideoPlayer.position(number).Premiered`\endlink
3667 /// <p>
3668 /// }
3669 /// \table_row3{ <b>`VideoPlayer.Trailer`</b>,
3670 /// \anchor VideoPlayer_Trailer
3671 /// _string_,
3672 /// @return The path to the trailer of the currently playing movie\, if it's in the database.
3673 /// <p>
3674 /// }
3675 /// \table_row3{ <b>`VideoPlayer.offset(number).Trailer`</b>,
3676 /// \anchor VideoPlayer_Offset_Trailer
3677 /// _string_,
3678 /// @return The path to the trailer of the video which has an offset `number` with respect to the currently playing video.
3679 /// <p><hr>
3680 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Trailer `VideoPlayer.offset(number).Title`\endlink
3681 /// <p>
3682 /// }
3683 /// \table_row3{ <b>`VideoPlayer.position(number).Trailer`</b>,
3684 /// \anchor VideoPlayer_Position_Trailer
3685 /// _string_,
3686 /// @return The path to the trailer of the video which has an offset `number` with respect to the start of the playlist.
3687 /// <p><hr>
3688 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Trailer `VideoPlayer.position(number).Trailer`\endlink
3689 /// <p>
3690 /// }
3691 /// \table_row3{ <b>`VideoPlayer.LastPlayed`</b>,
3692 /// \anchor VideoPlayer_LastPlayed
3693 /// _string_,
3694 /// @return The last play date of current playing Video\, if it's in the database.
3695 /// <p>
3696 /// }
3697 /// \table_row3{ <b>`VideoPlayer.offset(number).LastPlayed`</b>,
3698 /// \anchor VideoPlayer_Offset_LastPlayed
3699 /// _string_,
3700 /// @return The last play date of the video which has an offset `number` with respect to the currently playing video.
3701 /// <p><hr>
3702 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_LastPlayed `VideoPlayer.offset(number).LastPlayed`\endlink
3703 /// <p>
3704 /// }
3705 /// \table_row3{ <b>`VideoPlayer.position(number).LastPlayed`</b>,
3706 /// \anchor VideoPlayer_Position_LastPlayed
3707 /// _string_,
3708 /// @return The last play date of the video which has an offset `number` with respect to the start of the playlist.
3709 /// <p><hr>
3710 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_LastPlayed `VideoPlayer.position(number).LastPlayed`\endlink
3711 /// <p>
3712 /// }
3713 /// \table_row3{ <b>`VideoPlayer.PlayCount`</b>,
3714 /// \anchor VideoPlayer_PlayCount
3715 /// _string_,
3716 /// @return The playcount of current playing Video\, if it's in the database.
3717 /// <p>
3718 /// }
3719 /// \table_row3{ <b>`VideoPlayer.offset(number).PlayCount`</b>,
3720 /// \anchor VideoPlayer_Offset_PlayCount
3721 /// _string_,
3722 /// @return The playcount of the video which has an offset `number` with respect to the currently playing video.
3723 /// <p><hr>
3724 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlayCount `VideoPlayer.offset(number).PlayCount`\endlink
3725 /// <p>
3726 /// }
3727 /// \table_row3{ <b>`VideoPlayer.position(number).PlayCount`</b>,
3728 /// \anchor VideoPlayer_Position_PlayCount
3729 /// _string_,
3730 /// @return The playcount of the video which has an offset `number` with respect to the start of the playlist.
3731 /// <p><hr>
3732 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlayCount `VideoPlayer.position(number).PlayCount`\endlink
3733 /// <p>
3734 /// }
3735 /// \table_row3{ <b>`VideoPlayer.VideoCodec`</b>,
3736 /// \anchor VideoPlayer_VideoCodec
3737 /// _string_,
3738 /// @return The video codec of the currently playing video (common values: see
3739 /// \ref ListItem_VideoCodec "ListItem.VideoCodec").
3740 /// <p>
3741 /// }
3742 /// \table_row3{ <b>`VideoPlayer.VideoResolution`</b>,
3743 /// \anchor VideoPlayer_VideoResolution
3744 /// _string_,
3745 /// @return The video resolution of the currently playing video (possible
3746 /// values: see \ref ListItem_VideoResolution "ListItem.VideoResolution").
3747 /// <p>
3748 /// }
3749 /// \table_row3{ <b>`VideoPlayer.VideoAspect`</b>,
3750 /// \anchor VideoPlayer_VideoAspect
3751 /// _string_,
3752 /// @return The aspect ratio of the currently playing video (possible values:
3753 /// see \ref ListItem_VideoAspect "ListItem.VideoAspect").
3754 /// <p>
3755 /// }
3756 /// \table_row3{ <b>`VideoPlayer.AudioCodec`</b>,
3757 /// \anchor VideoPlayer_AudioCodec
3758 /// _string_,
3759 /// @return The audio codec of the currently playing video\, optionally 'n'
3760 /// defines the number of the audiostream (common values: see
3761 /// \ref ListItem_AudioCodec "ListItem.AudioCodec").
3762 /// <p>
3763 /// }
3764 /// \table_row3{ <b>`VideoPlayer.AudioChannels`</b>,
3765 /// \anchor VideoPlayer_AudioChannels
3766 /// _string_,
3767 /// @return The number of audio channels of the currently playing video
3768 /// (possible values: see \ref ListItem_AudioChannels "ListItem.AudioChannels").
3769 /// <p><hr>
3770 /// @skinning_v16 **[Infolabel Updated]** \link VideoPlayer_AudioChannels `VideoPlayer.AudioChannels`\endlink
3771 /// if a video contains no audio\, these infolabels will now return empty.
3772 /// (they used to return 0)
3773 /// <p>
3774 /// }
3775 /// \table_row3{ <b>`VideoPlayer.AudioLanguage`</b>,
3776 /// \anchor VideoPlayer_AudioLanguage
3777 /// _string_,
3778 /// @return The language of the audio of the currently playing video(possible
3779 /// values: see \ref ListItem_AudioLanguage "ListItem.AudioLanguage").
3780 /// <p><hr>
3781 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_AudioLanguage `VideoPlayer.AudioLanguage`\endlink
3782 /// <p>
3783 /// }
3784 /// \table_row3{ <b>`VideoPlayer.SubtitlesLanguage`</b>,
3785 /// \anchor VideoPlayer_SubtitlesLanguage
3786 /// _string_,
3787 /// @return The language of the subtitle of the currently playing video
3788 /// (possible values: see \ref ListItem_SubtitleLanguage "ListItem.SubtitleLanguage").
3789 /// @note `VideoPlayer.SubtitlesLanguage` holds the language of the next available
3790 /// subtitle stream if subtitles are disabled in the player
3791 /// <p><hr>
3792 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_SubtitlesLanguage `VideoPlayer.SubtitlesLanguage`\endlink
3793 /// <p>
3794 /// }
3795 /// \table_row3{ <b>`VideoPlayer.StereoscopicMode`</b>,
3796 /// \anchor VideoPlayer_StereoscopicMode
3797 /// _string_,
3798 /// @return The stereoscopic mode of the currently playing video (possible
3799 /// values: see \ref ListItem_StereoscopicMode "ListItem.StereoscopicMode").
3800 /// <p><hr>
3801 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_StereoscopicMode `VideoPlayer.StereoscopicMode`\endlink
3802 /// <p>
3803 /// }
3804 /// \table_row3{ <b>`VideoPlayer.StartTime`</b>,
3805 /// \anchor VideoPlayer_StartTime
3806 /// _string_,
3807 /// @return The start date and time of the currently playing epg event or recording (PVR).
3808 /// <p>
3809 /// }
3810 /// \table_row3{ <b>`VideoPlayer.EndTime`</b>,
3811 /// \anchor VideoPlayer_EndTime
3812 /// _string_,
3813 /// @return The end date and time of the currently playing epg event or recording (PVR).
3814 /// <p>
3815 /// }
3816 /// \table_row3{ <b>`VideoPlayer.NextTitle`</b>,
3817 /// \anchor VideoPlayer_NextTitle
3818 /// _string_,
3819 /// @return The title of the programme that will be played next (PVR).
3820 /// <p>
3821 /// }
3822 /// \table_row3{ <b>`VideoPlayer.NextGenre`</b>,
3823 /// \anchor VideoPlayer_NextGenre
3824 /// _string_,
3825 /// @return The genre of the programme that will be played next (PVR).
3826 /// <p>
3827 /// }
3828 /// \table_row3{ <b>`VideoPlayer.NextPlot`</b>,
3829 /// \anchor VideoPlayer_NextPlot
3830 /// _string_,
3831 /// @return The plot of the programme that will be played next (PVR).
3832 /// <p>
3833 /// }
3834 /// \table_row3{ <b>`VideoPlayer.NextPlotOutline`</b>,
3835 /// \anchor VideoPlayer_NextPlotOutline
3836 /// _string_,
3837 /// @return The plot outline of the programme that will be played next (PVR).
3838 /// <p>
3839 /// }
3840 /// \table_row3{ <b>`VideoPlayer.NextStartTime`</b>,
3841 /// \anchor VideoPlayer_NextStartTime
3842 /// _string_,
3843 /// @return The start time of the programme that will be played next (PVR).
3844 /// <p>
3845 /// }
3846 /// \table_row3{ <b>`VideoPlayer.NextEndTime`</b>,
3847 /// \anchor VideoPlayer_NextEndTime
3848 /// _string_,
3849 /// @return The end time of the programme that will be played next (PVR).
3850 /// <p>
3851 /// }
3852 /// \table_row3{ <b>`VideoPlayer.NextDuration`</b>,
3853 /// \anchor VideoPlayer_NextDuration
3854 /// _string_,
3855 /// @return The duration of the programme that will be played next (PVR).
3856 /// <p>
3857 /// }
3858 /// \table_row3{ <b>`VideoPlayer.ChannelName`</b>,
3859 /// \anchor VideoPlayer_ChannelName
3860 /// _string_,
3861 /// @return The name of the currently tuned channel (PVR).
3862 /// <p>
3863 /// }
3864 /// \table_row3{ <b>`VideoPlayer.ChannelLogo`</b>,
3865 /// \anchor VideoPlayer_ChannelLogo
3866 /// _string_,
3867 /// @return The path for the logo of the currently playing TV channel\, if available (PVR).
3868 /// <p><hr>
3869 /// @skinning_v22 **[New Infolabel]** \link VideoPlayer_ChannelLogo `VideoPlayer.ChannelLogo`\endlink
3870 /// <p>
3871 /// }
3872 /// \table_row3{ <b>`VideoPlayer.ChannelNumberLabel`</b>,
3873 /// \anchor VideoPlayer_ChannelNumberLabel
3874 /// _string_,
3875 /// @return The channel and subchannel number of the tv channel that's currently playing (PVR).
3876 /// <p><hr>
3877 /// @skinning_v14 **[New Infolabel]** \link VideoPlayer_ChannelNumberLabel `VideoPlayer.ChannelNumberLabel`\endlink
3878 /// <p>
3879 /// }
3880 /// \table_row3{ <b>`VideoPlayer.ChannelGroup`</b>,
3881 /// \anchor VideoPlayer_ChannelGroup
3882 /// _string_,
3883 /// @return The group of the currently tuned channel (PVR).
3884 /// <p>
3885 /// }
3886 /// \table_row3{ <b>`VideoPlayer.ParentalRating`</b>,
3887 /// \anchor VideoPlayer_ParentalRating
3888 /// _string_,
3889 /// @return The parental rating of the currently playing programme (PVR).
3890 /// <p>
3891 /// }
3892 /// \table_row3{ <b>`VideoPlayer.DBID`</b>,
3893 /// \anchor VideoPlayer_DBID
3894 /// _string_,
3895 /// @return The database id of the currently playing video
3896 /// <p><hr>
3897 /// @skinning_v17 **[New Infolabel]** \link VideoPlayer_DBID `VideoPlayer.DBID`\endlink
3898 /// <p>
3899 /// }
3900 /// \table_row3{ <b>`VideoPlayer.offset(number).DBID`</b>,
3901 /// \anchor VideoPlayer_Offset_DBID
3902 /// _string_,
3903 /// @return The database id of the video which has an offset `number` with respect to the currently playing video.
3904 /// <p><hr>
3905 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_DBID `VideoPlayer.offset(number).DBID`\endlink
3906 /// <p>
3907 /// }
3908 /// \table_row3{ <b>`VideoPlayer.position(number).DBID`</b>,
3909 /// \anchor VideoPlayer_Position_DBID
3910 /// _string_,
3911 /// @return The database id of the video which has an offset `number` with respect to the start of the playlist.
3912 /// <p><hr>
3913 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_DBID `VideoPlayer.position(number).DBID`\endlink
3914 /// <p>
3915 /// }
3916 /// \table_row3{ <b>`VideoPlayer.UniqueID(name)`</b>,
3917 /// \anchor VideoPlayer_UniqueID
3918 /// _string_,
3919 /// @return The scraped metadata id of current movie\, if it's in the database.
3920 /// @param name - the name of the metadata provider.
3921 /// <p><hr>
3922 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_UniqueID `VideoPlayer.UniqueID(name)`\endlink
3923 /// <p>
3924 /// }
3925 /// \table_row3{ <b>`VideoPlayer.TvShowDBID`</b>,
3926 /// \anchor VideoPlayer_TvShowDBID
3927 /// _string_,
3928 /// @return The database id of the TvShow for the currently playing Episode
3929 /// <p><hr>
3930 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_TvShowDBID `VideoPlayer.TvShowDBID`\endlink
3931 /// <p>
3932 /// }
3933 /// \table_row3{ <b>`VideoPlayer.AudioStreamCount`</b>,
3934 /// \anchor VideoPlayer_AudioStreamCount
3935 /// _integer_,
3936 /// @return The number of audio streams of the currently playing video.
3937 /// @note If the video contains no audio streams it returns 0.
3938 /// <p><hr>
3939 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_AudioStreamCount `VideoPlayer.AudioStreamCount`\endlink
3940 /// <p>
3941 /// }
3942 /// \table_row3{ <b>`VideoPlayer.HdrType`</b>,
3943 /// \anchor VideoPlayer_HdrType
3944 /// _string_,
3945 /// @return String containing the name of the detected HDR type or empty if not HDR. See \ref StreamHdrType for the list of possible values.
3946 /// <p><hr>
3947 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_HdrType `VideoPlayer.HdrType`\endlink
3948 /// <p>
3949 /// }
3950 /// \table_row3{ <b>`VideoPlayer.VideoVersionName`</b>,
3951 /// \anchor VideoPlayer_VideoVersionName
3952 /// _string_,
3953 /// @return String containing the version name of the currently playing video (movie) - empty if not a movie\, version name is not set or not a version
3954 /// <p><hr>
3955 /// @skinning_v21 **[New Infolabel]** \link VideoPlayer_VideoVersionName `VideoPlayer.VideoVersionName`\endlink
3956 /// }
3957 /// \table_end
3959 /// -----------------------------------------------------------------------------
3960 // clang-format off
3961 const infomap videoplayer[] = {{ "title", VIDEOPLAYER_TITLE },
3962 { "genre", VIDEOPLAYER_GENRE },
3963 { "country", VIDEOPLAYER_COUNTRY },
3964 { "originaltitle", VIDEOPLAYER_ORIGINALTITLE },
3965 { "director", VIDEOPLAYER_DIRECTOR },
3966 { "year", VIDEOPLAYER_YEAR },
3967 { "cover", VIDEOPLAYER_COVER },
3968 { "usingoverlays", VIDEOPLAYER_USING_OVERLAYS },
3969 { "isfullscreen", VIDEOPLAYER_ISFULLSCREEN },
3970 { "hasmenu", VIDEOPLAYER_HASMENU },
3971 { "playlistlength", VIDEOPLAYER_PLAYLISTLEN },
3972 { "playlistposition", VIDEOPLAYER_PLAYLISTPOS },
3973 { "plot", VIDEOPLAYER_PLOT },
3974 { "plotoutline", VIDEOPLAYER_PLOT_OUTLINE },
3975 { "episode", VIDEOPLAYER_EPISODE },
3976 { "season", VIDEOPLAYER_SEASON },
3977 { "rating", VIDEOPLAYER_RATING },
3978 { "ratingandvotes", VIDEOPLAYER_RATING_AND_VOTES },
3979 { "userrating", VIDEOPLAYER_USER_RATING },
3980 { "votes", VIDEOPLAYER_VOTES },
3981 { "tvshowtitle", VIDEOPLAYER_TVSHOW },
3982 { "premiered", VIDEOPLAYER_PREMIERED },
3983 { "studio", VIDEOPLAYER_STUDIO },
3984 { "mpaa", VIDEOPLAYER_MPAA },
3985 { "top250", VIDEOPLAYER_TOP250 },
3986 { "cast", VIDEOPLAYER_CAST },
3987 { "castandrole", VIDEOPLAYER_CAST_AND_ROLE },
3988 { "artist", VIDEOPLAYER_ARTIST },
3989 { "album", VIDEOPLAYER_ALBUM },
3990 { "writer", VIDEOPLAYER_WRITER },
3991 { "tagline", VIDEOPLAYER_TAGLINE },
3992 { "hasinfo", VIDEOPLAYER_HAS_INFO },
3993 { "trailer", VIDEOPLAYER_TRAILER },
3994 { "videocodec", VIDEOPLAYER_VIDEO_CODEC },
3995 { "videoresolution", VIDEOPLAYER_VIDEO_RESOLUTION },
3996 { "videoaspect", VIDEOPLAYER_VIDEO_ASPECT },
3997 { "videobitrate", VIDEOPLAYER_VIDEO_BITRATE },
3998 { "audiocodec", VIDEOPLAYER_AUDIO_CODEC },
3999 { "audiochannels", VIDEOPLAYER_AUDIO_CHANNELS },
4000 { "audiobitrate", VIDEOPLAYER_AUDIO_BITRATE },
4001 { "audiolanguage", VIDEOPLAYER_AUDIO_LANG },
4002 { "hasteletext", VIDEOPLAYER_HASTELETEXT },
4003 { "lastplayed", VIDEOPLAYER_LASTPLAYED },
4004 { "playcount", VIDEOPLAYER_PLAYCOUNT },
4005 { "hassubtitles", VIDEOPLAYER_HASSUBTITLES },
4006 { "subtitlesenabled", VIDEOPLAYER_SUBTITLESENABLED },
4007 { "subtitleslanguage",VIDEOPLAYER_SUBTITLES_LANG },
4008 { "starttime", VIDEOPLAYER_STARTTIME },
4009 { "endtime", VIDEOPLAYER_ENDTIME },
4010 { "nexttitle", VIDEOPLAYER_NEXT_TITLE },
4011 { "nextgenre", VIDEOPLAYER_NEXT_GENRE },
4012 { "nextplot", VIDEOPLAYER_NEXT_PLOT },
4013 { "nextplotoutline", VIDEOPLAYER_NEXT_PLOT_OUTLINE },
4014 { "nextstarttime", VIDEOPLAYER_NEXT_STARTTIME },
4015 { "nextendtime", VIDEOPLAYER_NEXT_ENDTIME },
4016 { "nextduration", VIDEOPLAYER_NEXT_DURATION },
4017 { "channelname", VIDEOPLAYER_CHANNEL_NAME },
4018 { "channellogo", VIDEOPLAYER_CHANNEL_LOGO },
4019 { "channelnumberlabel", VIDEOPLAYER_CHANNEL_NUMBER },
4020 { "channelgroup", VIDEOPLAYER_CHANNEL_GROUP },
4021 { "hasepg", VIDEOPLAYER_HAS_EPG },
4022 { "parentalrating", VIDEOPLAYER_PARENTAL_RATING },
4023 { "isstereoscopic", VIDEOPLAYER_IS_STEREOSCOPIC },
4024 { "stereoscopicmode", VIDEOPLAYER_STEREOSCOPIC_MODE },
4025 { "canresumelivetv", VIDEOPLAYER_CAN_RESUME_LIVE_TV },
4026 { "imdbnumber", VIDEOPLAYER_IMDBNUMBER },
4027 { "episodename", VIDEOPLAYER_EPISODENAME },
4028 { "dbid", VIDEOPLAYER_DBID },
4029 { "uniqueid", VIDEOPLAYER_UNIQUEID },
4030 { "tvshowdbid", VIDEOPLAYER_TVSHOWDBID },
4031 { "audiostreamcount", VIDEOPLAYER_AUDIOSTREAMCOUNT },
4032 { "hdrtype", VIDEOPLAYER_HDR_TYPE },
4033 { "art", VIDEOPLAYER_ART},
4034 { "videoversionname", VIDEOPLAYER_VIDEOVERSION_NAME},
4035 { "hasvideoversions", VIDEOPLAYER_HAS_VIDEOVERSIONS}
4037 // clang-format on
4039 /// \page modules__infolabels_boolean_conditions
4040 /// \subsection modules__infolabels_boolean_conditions_RetroPlayer RetroPlayer
4041 /// \table_start
4042 /// \table_h3{ Labels, Type, Description }
4043 /// \table_row3{ <b>`RetroPlayer.VideoFilter`</b>,
4044 /// \anchor RetroPlayer_VideoFilter
4045 /// _string_,
4046 /// @return The video filter of the currently-playing game.
4047 /// The following values are possible:
4048 /// - <b>`nearest`</b> (Nearest neighbor\, i.e. pixelate)
4049 /// - <b>`linear`</b> (Bilinear filtering\, i.e. smooth blur)
4050 /// <p><hr>
4051 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoFilter `RetroPlayer.VideoFilter`\endlink
4052 /// <p>
4053 /// }
4054 /// \table_row3{ <b>`RetroPlayer.StretchMode`</b>,
4055 /// \anchor RetroPlayer_StretchMode
4056 /// _string_,
4057 /// @return The stretch mode of the currently-playing game.
4058 /// The following values are possible:
4059 /// - <b>`normal`</b> (Show the game normally)
4060 /// - <b>`4:3`</b> (Stretch to a 4:3 aspect ratio)
4061 /// - <b>`fullscreen`</b> (Stretch to the full viewing area)
4062 /// - <b>`original`</b> (Shrink to the original resolution)
4063 /// <p><hr>
4064 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_StretchMode `RetroPlayer.StretchMode`\endlink
4065 /// <p>
4066 /// }
4067 /// \table_row3{ <b>`RetroPlayer.VideoRotation`</b>,
4068 /// \anchor RetroPlayer_VideoRotation
4069 /// _integer_,
4070 /// @return The video rotation of the currently-playing game
4071 /// in degrees counter-clockwise.
4072 /// The following values are possible:
4073 /// - <b>`0`</b>
4074 /// - <b>`90`</b> (Shown in the GUI as 270 degrees)
4075 /// - <b>`180`</b>
4076 /// - <b>`270`</b> (Shown in the GUI as 90 degrees)
4077 /// <p><hr>
4078 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoRotation `RetroPlayer.VideoRotation`\endlink
4079 /// <p>
4080 /// }
4081 /// \table_end
4083 /// -----------------------------------------------------------------------------
4084 const infomap retroplayer[] =
4086 { "videofilter", RETROPLAYER_VIDEO_FILTER},
4087 { "stretchmode", RETROPLAYER_STRETCH_MODE},
4088 { "videorotation", RETROPLAYER_VIDEO_ROTATION},
4091 /// \page modules__infolabels_boolean_conditions
4092 /// \subsection modules__infolabels_boolean_conditions_Container Container
4093 /// \table_start
4094 /// \table_h3{ Labels, Type, Description }
4095 /// \table_row3{ <b>`Container.HasFiles`</b>,
4096 /// \anchor Container_HasFiles
4097 /// _boolean_,
4098 /// @return **True** if the container contains files.
4099 /// <p>
4100 /// }
4101 /// \table_row3{ <b>`Container.HasFolders`</b>,
4102 /// \anchor Container_HasFolders
4103 /// _boolean_,
4104 /// @return **True** if the container contains folders.
4105 /// <p>
4106 /// }
4107 /// \table_row3{ <b>`Container.IsStacked`</b>,
4108 /// \anchor Container_IsStacked
4109 /// _boolean_,
4110 /// @return **True** if the container is currently in stacked mode.
4111 /// <p>
4112 /// }
4113 /// \table_row3{ <b>`Container.FolderPath`</b>,
4114 /// \anchor Container_FolderPath
4115 /// _string_,
4116 /// @return The complete path of currently displayed folder.
4117 /// <p>
4118 /// }
4119 /// \table_row3{ <b>`Container.FolderName`</b>,
4120 /// \anchor Container_FolderName
4121 /// _string_,
4122 /// @return The top most folder in currently displayed folder.
4123 /// <p>
4124 /// }
4125 /// \table_row3{ <b>`Container.PluginName`</b>,
4126 /// \anchor Container_PluginName
4127 /// _string_,
4128 /// @return The current plugins base folder name.
4129 /// <p>
4130 /// }
4131 /// \table_row3{ <b>`Container.PluginCategory`</b>,
4132 /// \anchor Container_PluginCategory
4133 /// _string_,
4134 /// @return The current plugins category (set by the scripter).
4135 /// <p><hr>
4136 /// @skinning_v17 **[New Infolabel]** \link Container_PluginCategory `Container.PluginCategory`\endlink
4137 /// <p>
4138 /// }
4139 /// \table_row3{ <b>`Container.Viewmode`</b>,
4140 /// \anchor Container_Viewmode
4141 /// _string_,
4142 /// @return The current viewmode (list\, icons etc).
4143 /// <p>
4144 /// }
4145 /// \table_row3{ <b>`Container.ViewCount`</b>,
4146 /// \anchor Container_ViewCount
4147 /// _integer_,
4148 /// @return The number of available skin view modes for the current container listing.
4149 /// <p><hr>
4150 /// @skinning_v17 **[New Infolabel]** \link Container_ViewCount `Container.ViewCount`\endlink
4151 /// <p>
4152 /// }
4153 /// \table_row3{ <b>`Container.Totaltime`</b>,
4154 /// \anchor Container_Totaltime
4155 /// _string_,
4156 /// @return The total time of all items in the current container.
4157 /// <p>
4158 /// }
4159 /// \table_row3{ <b>`Container.TotalWatched`</b>,
4160 /// \anchor Container_TotalWatched
4161 /// _string_,
4162 /// @return The number of watched items in the container.
4163 /// @param id - [opt] if not supplied the current container will be used.
4164 /// <p><hr>
4165 /// @skinning_v16 **[New Infolabel]** \link Container_TotalWatched `Container(id).TotalWatched`\endlink
4166 /// <p>
4167 /// }
4168 /// \table_row3{ <b>`Container.TotalUnWatched`</b>,
4169 /// \anchor Container_TotalUnWatched
4170 /// _string_,
4171 /// @return The number of unwatched items in the container.
4172 /// @param id - [opt] if not supplied the current container will be used.
4173 /// <p><hr>
4174 /// @skinning_v16 **[New Infolabel]** \link Container_TotalUnWatched `Container(id).TotalUnWatched`\endlink
4175 /// <p>
4176 /// }
4177 /// \table_row3{ <b>`Container.HasThumb`</b>,
4178 /// \anchor Container_HasThumb
4179 /// _boolean_,
4180 /// @return **True** if the current container you are in has a thumb assigned
4181 /// to it.
4182 /// <p>
4183 /// }
4184 /// \table_row3{ <b>`Container.SortOrder`</b>,
4185 /// \anchor Container_SortOrder
4186 /// _string_,
4187 /// @return The current sort order (Ascending/Descending).
4188 /// <p><hr>
4189 /// @skinning_v16 **[New Infolabel]** \link Container_SortOrder `Container.SortOrder`\endlink
4190 /// <p>
4191 /// }
4192 /// \table_row3{ <b>`Container.CanFilter`</b>,
4193 /// \anchor Container_CanFilter
4194 /// _boolean_,
4195 /// @return **True** when the current container can be filtered.
4196 /// <p>
4197 /// }
4198 /// \table_row3{ <b>`Container.CanFilterAdvanced`</b>,
4199 /// \anchor Container_CanFilterAdvanced
4200 /// _boolean_,
4201 /// @return **True** when advanced filtering can be applied to the current container.
4202 /// <p>
4203 /// }
4204 /// \table_row3{ <b>`Container.Filtered`</b>,
4205 /// \anchor Container_Filtered
4206 /// _boolean_,
4207 /// @return **True** when a mediafilter is applied to the current container.
4208 /// <p>
4209 /// }
4210 /// \table_row3{ <b>`Container.ShowPlot`</b>,
4211 /// \anchor Container_ShowPlot
4212 /// _string_,
4213 /// @return The TV Show plot of the current container and can be used at
4214 /// season and episode level.
4215 /// <p>
4216 /// }
4217 /// \table_row3{ <b>`Container.ShowTitle`</b>,
4218 /// \anchor Container_ShowTitle
4219 /// _string_,
4220 /// @return The TV Show title of the current container and can be used at
4221 /// season and episode level.
4222 /// <p><hr>
4223 /// @skinning_v17 **[New Infolabel]** \link Container_ShowTitle `Container.ShowTitle`\endlink
4224 /// <p>
4225 /// }
4226 const infomap mediacontainer[] = {{ "hasfiles", CONTAINER_HASFILES },
4227 { "hasfolders", CONTAINER_HASFOLDERS },
4228 { "isstacked", CONTAINER_STACKED },
4229 { "folderpath", CONTAINER_FOLDERPATH },
4230 { "foldername", CONTAINER_FOLDERNAME },
4231 { "pluginname", CONTAINER_PLUGINNAME },
4232 { "plugincategory", CONTAINER_PLUGINCATEGORY },
4233 { "viewmode", CONTAINER_VIEWMODE },
4234 { "viewcount", CONTAINER_VIEWCOUNT },
4235 { "totaltime", CONTAINER_TOTALTIME },
4236 { "totalwatched", CONTAINER_TOTALWATCHED },
4237 { "totalunwatched", CONTAINER_TOTALUNWATCHED },
4238 { "hasthumb", CONTAINER_HAS_THUMB },
4239 { "sortorder", CONTAINER_SORT_ORDER },
4240 { "canfilter", CONTAINER_CAN_FILTER },
4241 { "canfilteradvanced",CONTAINER_CAN_FILTERADVANCED },
4242 { "filtered", CONTAINER_FILTERED },
4243 { "showplot", CONTAINER_SHOWPLOT },
4244 { "showtitle", CONTAINER_SHOWTITLE }};
4246 /// \page modules__infolabels_boolean_conditions
4247 /// \table_row3{ <b>`Container(id).OnNext`</b>,
4248 /// \anchor Container_OnNext
4249 /// _boolean_,
4250 /// @return **True** if the container with id (or current container if id is
4251 /// omitted) is moving to the next item. Allows views to be
4252 /// custom-designed (such as 3D coverviews etc.)
4253 /// <p>
4254 /// }
4255 /// \table_row3{ <b>`Container(id).OnScrollNext`</b>,
4256 /// \anchor Container_OnScrollNext
4257 /// _boolean_,
4258 /// @return **True** if the container with id (or current container if id is
4259 /// omitted) is scrolling to the next item. Differs from \ref Container_OnNext "OnNext" in that
4260 /// \ref Container_OnNext "OnNext" triggers on movement even if there is no scroll involved.
4261 /// <p>
4262 /// }
4263 /// \table_row3{ <b>`Container(id).OnPrevious`</b>,
4264 /// \anchor Container_OnPrevious
4265 /// _boolean_,
4266 /// @return **True** if the container with id (or current container if id is
4267 /// omitted) is moving to the previous item. Allows views to be
4268 /// custom-designed (such as 3D coverviews etc).
4269 /// <p>
4270 /// }
4271 /// \table_row3{ <b>`Container(id).OnScrollPrevious`</b>,
4272 /// \anchor Container_OnScrollPrevious
4273 /// _boolean_,
4274 /// @return **True** if the container with id (or current container if id is
4275 /// omitted) is scrolling to the previous item. Differs from \ref Container_OnPrevious "OnPrevious" in
4276 /// that \ref Container_OnPrevious "OnPrevious" triggers on movement even if there is no scroll involved.
4277 /// <p>
4278 /// }
4279 /// \table_row3{ <b>`Container(id).NumPages`</b>,
4280 /// \anchor Container_NumPages
4281 /// _integer_,
4282 /// @return The number of pages in the container with given id. If no id is specified it
4283 /// grabs the current container.
4284 /// <p>
4285 /// }
4286 /// \table_row3{ <b>`Container(id).NumItems`</b>,
4287 /// \anchor Container_NumItems
4288 /// _integer_,
4289 /// @return The number of items in the container or grouplist with given id excluding parent folder item.
4290 /// @note If no id is specified it grabs the current container.
4291 /// <p>
4292 /// }
4293 /// \table_row3{ <b>`Container(id).NumAllItems`</b>,
4294 /// \anchor Container_NumAllItems
4295 /// _integer_,
4296 /// @return The number of all items in the container or grouplist with given id including parent folder item.
4297 /// @note If no id is specified it grabs the current container.
4298 /// <p><hr>
4299 /// @skinning_v18 **[New Infolabel]** \link Container_NumAllItems `Container(id).NumAllItems`\endlink
4300 /// <p>
4301 /// }
4302 /// \table_row3{ <b>`Container(id).NumNonFolderItems`</b>,
4303 /// \anchor Container_NumNonFolderItems
4304 /// _integer_,
4305 /// @return The Number of items in the container or grouplist with given id excluding all folder items.
4306 /// @note **Example:** pvr recordings folders\, parent ".." folder).
4307 /// If no id is specified it grabs the current container.
4308 /// <p><hr>
4309 /// @skinning_v18 **[New Infolabel]** \link Container_NumNonFolderItems `Container(id).NumNonFolderItems`\endlink
4310 /// <p>
4311 /// }
4312 /// \table_row3{ <b>`Container(id).CurrentPage`</b>,
4313 /// \anchor Container_CurrentPage
4314 /// _string_,
4315 /// @return THe current page in the container with given id.
4316 /// @note If no id is specified it grabs the current container.
4317 /// <p>
4318 /// }
4319 /// \table_row3{ <b>`Container(id).CurrentItem`</b>,
4320 /// \anchor Container_CurrentItem
4321 /// _integer_,
4322 /// @return The current item in the container or grouplist with given id.
4323 /// @note If no id is specified it grabs the current container.
4324 /// <p><hr>
4325 /// @skinning_v15 **[New Infolabel]** \link Container_CurrentItem `Container(id).CurrentItem`\endlink
4326 /// <p>
4327 /// }
4328 /// \table_row3{ <b>`Container(id).Scrolling`</b>,
4329 /// \anchor Container_Scrolling
4330 /// _boolean_,
4331 /// @return **True** if the user is currently scrolling through the container
4332 /// with id (or current container if id is omitted).
4333 /// @note This is slightly delayed from the actual scroll start. Use
4334 /// \ref Container_OnScrollNext "Container(id).OnScrollNext" or
4335 /// \ref Container_OnScrollPrevious "Container(id).OnScrollPrevious" to trigger animations
4336 /// immediately on scroll.
4337 /// <p>
4338 /// }
4339 /// \table_row3{ <b>`Container(id).HasNext`</b>,
4340 /// \anchor Container_HasNext
4341 /// _boolean_,
4342 /// @return **True** if the container or textbox with id (id) has a next page.
4343 /// <p>
4344 /// }
4345 /// \table_row3{ <b>`Container(id).HasParent`</b>,
4346 /// \anchor Container_HasParent
4347 /// _boolean_,
4348 /// @return **True** when the container with given id contains a parent ('..') item.
4349 /// @note If no id is specified it grabs the current container.
4350 /// <p><hr>
4351 /// @skinning_v16 **[New Boolean Condition]** \link Container_HasParent `Container.HasParent`\endlink
4352 /// <p>
4353 /// }
4354 /// \table_row3{ <b>`Container(id).HasPrevious`</b>,
4355 /// \anchor Container_HasPrevious
4356 /// _boolean_,
4357 /// @return **True** if the container or textbox with id (id) has a previous page.
4358 /// <p>
4359 /// }
4360 /// \table_row3{ <b>`Container(id).IsUpdating`</b>,
4361 /// \anchor Container_IsUpdating
4362 /// _boolean_,
4363 /// @return **True** if the container with dynamic list content is currently updating.
4364 /// }
4365 const infomap container_bools[] ={{ "onnext", CONTAINER_MOVE_NEXT },
4366 { "onprevious", CONTAINER_MOVE_PREVIOUS },
4367 { "onscrollnext", CONTAINER_SCROLL_NEXT },
4368 { "onscrollprevious", CONTAINER_SCROLL_PREVIOUS },
4369 { "numpages", CONTAINER_NUM_PAGES },
4370 { "numitems", CONTAINER_NUM_ITEMS },
4371 { "numnonfolderitems", CONTAINER_NUM_NONFOLDER_ITEMS },
4372 { "numallitems", CONTAINER_NUM_ALL_ITEMS },
4373 { "currentpage", CONTAINER_CURRENT_PAGE },
4374 { "currentitem", CONTAINER_CURRENT_ITEM },
4375 { "scrolling", CONTAINER_SCROLLING },
4376 { "hasnext", CONTAINER_HAS_NEXT },
4377 { "hasparent", CONTAINER_HAS_PARENT_ITEM },
4378 { "hasprevious", CONTAINER_HAS_PREVIOUS },
4379 { "isupdating", CONTAINER_ISUPDATING }};
4381 /// \page modules__infolabels_boolean_conditions
4382 /// \table_row3{ <b>`Container(id).Row`</b>,
4383 /// \anchor Container_Row
4384 /// _integer_,
4385 /// @return The row number of the focused position in a panel container.
4386 /// <p><hr>
4387 /// @skinning_v16 **[New Infolabel]** \link Container_Row `Container(id).Row`\endlink
4388 /// <p>
4389 /// }
4390 /// \table_row3{ <b>`Container(id).Row(parameter)`</b>,
4391 /// \anchor Container_Row_parameter
4392 /// _boolean_,
4393 /// @return **True** if the row number of the focused position matches the specified parameter.
4394 /// <p>
4395 /// }
4396 /// \table_row3{ <b>`Container(id).Column`</b>,
4397 /// \anchor Container_Column
4398 /// _integer_,
4399 /// @return The column number of the focused position in a panel container.
4400 /// <p><hr>
4401 /// @skinning_v16 **[New Infolabel]** \link Container_Column `Container(id).Column`\endlink
4402 /// <p>
4403 /// }
4404 /// \table_row3{ <b>`Container(id).Column(parameter)`</b>,
4405 /// \anchor Container_Column_parameter
4406 /// _boolean_,
4407 /// @return **True** if the column number of the focused position matches the specified parameter.
4408 /// <p>
4409 /// }
4410 /// \table_row3{ <b>`Container(id).Position`</b>,
4411 /// \anchor Container_Position
4412 /// _integer_,
4413 /// @return The current focused position of container / grouplist (id) as a
4414 /// numeric label.
4415 /// <p><hr>
4416 /// @skinning_v16 **[Infolabel Updated]** \link Container_Position `Container(id).Position`\endlink
4417 /// now also returns the position for items inside a grouplist.
4418 /// <p>
4419 /// }
4420 /// \table_row3{ <b>`Container(id).Position(parameter)`</b>,
4421 /// \anchor Container_Position_parameter
4422 /// _boolean_,
4423 /// @return **True** if the container with id (or current container if id is omitted) is focused on the specified position.
4424 /// <p>
4425 /// }
4426 /// \table_row3{ <b>`Container(id).SubItem(item_number)`</b>,
4427 /// \anchor Container_SubItem
4428 /// _boolean_,
4429 /// @return **True** if the container with id (or current container if id is omitted) is focused on the specified subitem.
4430 /// @note If no id is specified it grabs the current container.
4431 /// <p>
4432 /// }
4433 /// \table_row3{ <b>`Container(id).HasFocus(item_number)`</b>,
4434 /// \anchor Container_HasFocus
4435 /// _boolean_,
4436 /// @return **True** if the container with id (or current container if id is
4437 /// omitted) has static content and is focused on the item with id
4438 /// item_number.
4439 /// <p>
4440 /// }
4441 /// \table_row3{ <b>`Container.SortMethod`</b>,
4442 /// \anchor Container_SortMethod
4443 /// _string_,
4444 /// @return The current sort method (returns a localized value).
4445 /// <p>
4446 /// }
4447 /// \table_row3{ <b>`Container.SortMethod(sortid)`</b>,
4448 /// \anchor Container_SortMethod_sortid
4449 /// _boolean_,
4450 /// @return **True** if the current sort method matches the specified SortID (see \ref List_of_sort_methods "SortUtils").
4451 /// <p>
4452 /// }
4453 const infomap container_ints[] = {{ "row", CONTAINER_ROW },
4454 { "column", CONTAINER_COLUMN },
4455 { "position", CONTAINER_POSITION },
4456 { "subitem", CONTAINER_SUBITEM },
4457 { "hasfocus", CONTAINER_HAS_FOCUS },
4458 { "sortmethod", CONTAINER_SORT_METHOD },
4461 /// \page modules__infolabels_boolean_conditions
4462 /// \table_row3{ <b>`Container.Property(addoncategory)`</b>,
4463 /// \anchor Container_Property_addoncategory
4464 /// _string_,
4465 /// @return The current add-on category.
4466 /// <p>
4467 /// }
4468 /// \table_row3{ <b>`Container.Property(reponame)`</b>,
4469 /// \anchor Container_Property_reponame
4470 /// _string_,
4471 /// @return The current add-on repository name.
4472 /// <p>
4473 /// }
4474 /// \table_row3{ <b>`Container.Content`</b>,
4475 /// \anchor Container_Content
4476 /// _string_,
4477 /// @return The content of the current container.
4478 /// <p><hr>
4479 /// @skinning_v16 **[New Infolabel]** \link Container_Content `Container.Content`\endlink
4480 /// <p>
4481 /// }
4482 /// \table_row3{ <b>`Container(id).ListItem(offset).Property`</b>,
4483 /// \anchor Container_ListItem_property
4484 /// _string_,
4485 /// @return the property of the ListItem with a given offset.
4486 /// @param offset - The offset for the listitem.
4487 /// @note `Property` has to be replaced with `Label`\, `Label2`\, `Icon` etc.
4488 /// @note **Example:** `Container(50).Listitem(2).Label `
4489 /// <p>
4490 /// }
4491 /// \table_row3{ <b>`Container(id).ListItemNoWrap(offset).Property`</b>,
4492 /// \anchor Container_ListItemNoWrap
4493 /// _string_,
4494 /// @return the same as \link Container_ListItem_property `Container(id).ListItem(offset).Property` \endlink
4495 /// but it won't wrap.
4496 /// @param offset - The offset for the listitem.
4497 /// @note That means if the last item of a list is focused\, `ListItemNoWrap(1)`
4498 /// will be empty while `ListItem(1)` will return the first item of the list.
4499 /// `Property` has to be replaced with `Label`\, `Label2`\, `Icon` etc.
4500 /// @note **Example:** `Container(50).ListitemNoWrap(1).Plot`
4501 /// <p>
4502 /// }
4503 /// \table_row3{ <b>`Container(id).ListItemPosition(x).[infolabel]`</b>,
4504 /// \anchor Container_ListItemPosition
4505 /// _string_,
4506 /// @return The infolabel for an item in a Container.
4507 /// @param x - the position in the container relative to the cursor position.
4508 /// @note **Example:** `Container(50).ListItemPosition(4).Genre`
4509 /// <p>
4510 /// }
4511 /// \table_row3{ <b>`Container(id).ListItemAbsolute(x).[infolabel]`</b>,
4512 /// \anchor Container_ListItemAbsolute
4513 /// _string_,
4514 /// @return The infolabel for an item in a Container.
4515 /// @param x - the absolute position in the container.
4516 /// @note **Example:** `Container(50).ListItemAbsolute(4).Genre`
4517 /// <p><hr>
4518 /// @skinning_v16 **[New Infolabel]** \link Container_ListItemAbsolute `Container(id).ListItemAbsolute(x).[infolabel]`\endlink
4519 /// <p>
4520 /// }
4521 /// \table_row3{ <b>`Container.Content(parameter)`</b>,
4522 /// \anchor Container_Content_parameter
4523 /// _string_,
4524 /// @return **True** if the current container you are in contains the following:
4525 /// - <b>files</b>
4526 /// - <b>songs</b>
4527 /// - <b>artists</b>
4528 /// - <b>albums</b>
4529 /// - <b>movies</b>
4530 /// - <b>tvshows</b>
4531 /// - <b>seasons</b>
4532 /// - <b>episodes</b>
4533 /// - <b>musicvideos</b>
4534 /// - <b>genres</b>
4535 /// - <b>years</b>
4536 /// - <b>actors</b>
4537 /// - <b>playlists</b>
4538 /// - <b>plugins</b>
4539 /// - <b>studios</b>
4540 /// - <b>directors</b>
4541 /// - <b>sets</b>
4542 /// - <b>tags</b>
4543 /// @note These currently only work in the Video and Music
4544 /// Library or unless a Plugin has set the value) also available are
4545 /// Addons true when a list of add-ons is shown LiveTV true when a
4546 /// htsp (tvheadend) directory is shown
4547 /// <p>
4548 /// }
4549 /// \table_row3{ <b>`Container.Art(type)`</b>,
4550 /// \anchor Container_Art
4551 /// _string_,
4552 /// @return The path to the art image file for the given type of the current container.
4553 /// @param type - the art type to request.
4554 /// @todo List of all art types
4555 /// <p><hr>
4556 /// @skinning_v16 **[Infolabel Updated]** \link Container_Art `Container.Art(type)`\endlink
4557 /// <b>set.fanart</b> as possible type value.
4558 /// @skinning_v15 **[New Infolabel]** \link Container_Art `Container.Art(type)`\endlink
4559 /// <p>
4560 /// }
4562 const infomap container_str[] = {{ "property", CONTAINER_PROPERTY },
4563 { "content", CONTAINER_CONTENT },
4564 { "art", CONTAINER_ART }};
4566 /// \page modules__infolabels_boolean_conditions
4567 /// \table_row3{ <b>`Container.SortDirection(direction)`</b>,
4568 /// \anchor Container_SortDirection
4569 /// _boolean_,
4570 /// @return **True** if the sort direction of a container equals direction.
4571 /// @param direction - The direction to check. It can be:
4572 /// - <b>ascending</b>
4573 /// - <b>descending</b>
4574 /// <p>
4575 /// }
4576 /// \table_end
4578 /// -----------------------------------------------------------------------------
4580 /// \page modules__infolabels_boolean_conditions
4581 /// \subsection modules__infolabels_boolean_conditions_ListItem ListItem
4582 /// \table_start
4583 /// \table_h3{ Labels, Type, Description }
4584 /// \table_row3{ <b>`ListItem.Thumb`</b>,
4585 /// \anchor ListItem_Thumb
4586 /// _string_,
4587 /// @return The thumbnail (if it exists) of the currently selected item
4588 /// in a list or thumb control.
4589 /// @deprecated but still available\, returns
4590 /// the same as \ref ListItem_Art_Type "ListItem.Art(thumb)"
4591 /// <p>
4592 /// }
4593 /// \table_row3{ <b>`ListItem.Icon`</b>,
4594 /// \anchor ListItem_Icon
4595 /// _string_,
4596 /// @return The thumbnail (if it exists) of the currently selected item in a list or thumb control.
4597 /// @note If no thumbnail image exists\, it will show the icon.
4598 /// <p>
4599 /// }
4600 /// \table_row3{ <b>`ListItem.ActualIcon`</b>,
4601 /// \anchor ListItem_ActualIcon
4602 /// _string_,
4603 /// @return The icon of the currently selected item in a list or thumb control.
4604 /// <p>
4605 /// }
4606 /// \table_row3{ <b>`ListItem.Overlay`</b>,
4607 /// \anchor ListItem_Overlay
4608 /// _string_,
4609 /// @return The overlay icon status of the currently selected item in a list or thumb control.
4610 /// - compressed file -- OverlayRAR.png
4611 /// - watched -- OverlayWatched.png
4612 /// - unwatched -- OverlayUnwatched.png
4613 /// - locked -- OverlayLocked.png
4614 /// <p>
4615 /// }
4616 /// \table_row3{ <b>`ListItem.IsFolder`</b>,
4617 /// \anchor ListItem_IsFolder
4618 /// _boolean_,
4619 /// @return **True** if the current ListItem is a folder.
4620 /// <p>
4621 /// }
4622 /// \table_row3{ <b>`ListItem.IsPlaying`</b>,
4623 /// \anchor ListItem_IsPlaying
4624 /// _boolean_,
4625 /// @return **True** if the current ListItem.* info labels and images are
4626 /// currently Playing media.
4627 /// <p>
4628 /// }
4629 /// \table_row3{ <b>`ListItem.IsResumable`</b>,
4630 /// \anchor ListItem_IsResumable
4631 /// _boolean_,
4632 /// @return **True** when the current ListItem has been partially played.
4633 /// <p>
4634 /// }
4635 /// \table_row3{ <b>`ListItem.IsCollection`</b>,
4636 /// \anchor ListItem_IsCollection
4637 /// _boolean_,
4638 /// @return **True** when the current ListItem is a movie set.
4639 /// <p><hr>
4640 /// @skinning_v15 **[New Boolean Condition]** \link ListItem_IsCollection `ListItem.IsCollection`\endlink
4641 /// <p>
4642 /// }
4643 /// \table_row3{ <b>`ListItem.IsSelected`</b>,
4644 /// \anchor ListItem_IsSelected
4645 /// _boolean_,
4646 /// @return **True** if the current ListItem is selected (f.e. currently playing
4647 /// in playlist window).
4648 /// <p>
4649 /// }
4650 /// \table_row3{ <b>`ListItem.HasEpg`</b>,
4651 /// \anchor ListItem_HasEpg
4652 /// _boolean_,
4653 /// @return **True** when the selected programme has epg info (PVR).
4654 /// <p>
4655 /// }
4656 /// \table_row3{ <b>`ListItem.HasTimer`</b>,
4657 /// \anchor ListItem_HasTimer
4658 /// _boolean_,
4659 /// @return **True** when a recording timer has been set for the selected
4660 /// programme (PVR).
4661 /// <p>
4662 /// }
4663 /// \table_row3{ <b>`ListItem.IsRecording`</b>,
4664 /// \anchor ListItem_IsRecording
4665 /// _boolean_,
4666 /// @return **True** when the selected programme is being recorded (PVR).
4667 /// <p>
4668 /// }
4669 /// \table_row3{ <b>`ListItem.IsPlayable`</b>,
4670 /// \anchor ListItem_IsPlayable
4671 /// _boolean_,
4672 /// @return **True** when the selected programme can be played (PVR)
4673 /// <p><hr>
4674 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_IsPlayable `ListItem.IsPlayable`\endlink
4675 /// <p>
4676 /// }
4677 /// \table_row3{ <b>`ListItem.HasArchive`</b>,
4678 /// \anchor ListItem_HasArchive
4679 /// _boolean_,
4680 /// @return **True** when the selected channel has a server-side back buffer (PVR)
4681 /// <p><hr>
4682 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_HasArchive `ListItem.HasArchive`\endlink
4683 /// <p>
4684 /// }
4685 /// \table_row3{ <b>`ListItem.IsEncrypted`</b>,
4686 /// \anchor ListItem_IsEncrypted
4687 /// _boolean_,
4688 /// @return **True** when the selected programme is encrypted (PVR).
4689 /// <p>
4690 /// }
4691 /// \table_row3{ <b>`ListItem.IsStereoscopic`</b>,
4692 /// \anchor ListItem_IsStereoscopic
4693 /// _boolean_,
4694 /// @return **True** when the selected video is a 3D (stereoscopic) video.
4695 /// <p><hr>
4696 /// @skinning_v13 **[New Boolean Condition]** \link ListItem_IsStereoscopic `ListItem.IsStereoscopic`\endlink
4697 /// <p>
4698 /// }
4699 /// \table_row3{ <b>`ListItem.Property(IsSpecial)`</b>,
4700 /// \anchor ListItem_Property_IsSpecial
4701 /// _boolean_,
4702 /// @return **True** if the current Season/Episode is a Special.
4703 /// <p>
4704 /// }
4705 /// \table_row3{ <b>`ListItem.Property(DateLabel)`</b>,
4706 /// \anchor ListItem_Property_DateLabel
4707 /// _boolean_,
4708 /// @return **True** if the item is a date label\, returns false if the item is a time label.
4709 /// @note Can be used in the rulerlayout of the epggrid control.
4710 /// <p>
4711 /// }
4712 /// \table_row3{ <b>`ListItem.Property(Addon.IsEnabled)`</b>,
4713 /// \anchor ListItem_Property_AddonIsEnabled
4714 /// _boolean_,
4715 /// @return **True** when the selected addon is enabled (for use in the addon
4716 /// info dialog only).
4717 /// <p><hr>
4718 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsEnabled `ListItem.Property(Addon.IsEnabled)`\endlink
4719 /// replaces `ListItem.Property(Addon.Enabled)`.
4720 /// <p>
4721 /// }
4722 /// \table_row3{ <b>`ListItem.Property(Addon.IsInstalled)`</b>,
4723 /// \anchor ListItem_Property_AddonIsInstalled
4724 /// _boolean_,
4725 /// @return **True** when the selected addon is installed (for use in the addon
4726 /// info dialog only).
4727 /// <p><hr>
4728 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsInstalled `ListItem.Property(Addon.IsInstalled)`\endlink
4729 /// replaces `ListItem.Property(Addon.Installed)`.
4730 /// <p>
4731 /// }
4732 /// \table_row3{ <b>`ListItem.Property(Addon.HasUpdate)`</b>,
4733 /// \anchor ListItem_Property_AddonHasUpdate
4734 /// _boolean_,
4735 /// @return **True** when there's an update available for the selected addon.
4736 /// <p><hr>
4737 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonHasUpdate `ListItem.Property(Addon.HasUpdate)`\endlink
4738 /// replaces `ListItem.Property(Addon.UpdateAvail)`.
4739 /// <p>
4740 /// }
4741 /// \table_row3{ <b>`ListItem.IsAutoUpdateable`</b>,
4742 /// \anchor ListItem_IsAutoUpdateable
4743 /// _boolean_,
4744 /// @return **True** if this add-on can be updated automatically.
4745 /// <p><hr>
4746 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_IsAutoUpdateable `ListItem.IsAutoUpdateable`\endlink
4747 /// <p>
4748 /// }
4749 /// \table_row3{ <b>`ListItem.Property(Addon.IsFromOfficialRepo)`</b>,
4750 /// \anchor ListItem_Property_AddonIsFromOfficialRepo
4751 /// _boolean_,
4752 /// @return **True** if this add-on is from an official repository.
4753 /// <p><hr>
4754 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsFromOfficialRepo `ListItem.Property(Addon.IsFromOfficialRepo)`\endlink
4755 /// <p>
4756 /// }
4757 /// \table_row3{ <b>`ListItem.Property(Addon.IsBinary)`</b>,
4758 /// \anchor ListItem_Property_AddonIsBinary
4759 /// _boolean_,
4760 /// @return **True** if this add-on is a binary addon.
4761 /// <p><hr>
4762 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsBinary `ListItem.Property(Addon.IsBinary)`\endlink
4763 /// <p>
4764 /// }
4765 /// \table_row3{ <b>`ListItem.Property(Addon.IsUpdate)`</b>,
4766 /// \anchor ListItem_Property_AddonIsUpdate
4767 /// _boolean_,
4768 /// @return **True** if this add-on is a valid update of an installed outdated add-on.
4769 /// <p><hr>
4770 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsUpdate `ListItem.Property(Addon.IsUpdate)`\endlink
4771 /// <p>
4772 /// }
4773 /// \table_row3{ <b>`ListItem.Property(Addon.ValidUpdateOrigin)`</b>,
4774 /// \anchor ListItem_Property_ValidUpdateOrigin
4775 /// _string_,
4776 /// @return The origin string of a valid update for the addon. Empty string if there is no valid update available.
4777 /// <p><hr>
4778 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateOrigin `ListItem.Property(Addon.ValidUpdateOrigin)`\endlink
4779 /// <p>
4780 /// }
4781 /// \table_row3{ <b>`ListItem.Property(Addon.ValidUpdateVersion)`</b>,
4782 /// \anchor ListItem_Property_ValidUpdateVersion
4783 /// _string_,
4784 /// @return The version string of a valid update for the addon. Empty string if there is no valid update available.
4785 /// <p><hr>
4786 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateVersion `ListItem.Property(Addon.ValidUpdateVersion)`\endlink
4787 /// <p>
4788 /// }
4789 /// \table_row3{ <b>`ListItem.Label`</b>,
4790 /// \anchor ListItem_Label
4791 /// _string_,
4792 /// @return The left label of the currently selected item in a container.
4793 /// <p>
4794 /// }
4795 /// \table_row3{ <b>`ListItem.Label2`</b>,
4796 /// \anchor ListItem_Label2
4797 /// _string_,
4798 /// @return The right label of the currently selected item in a container.
4799 /// <p>
4800 /// }
4801 /// \table_row3{ <b>`ListItem.Title`</b>,
4802 /// \anchor ListItem_Title
4803 /// _string_,
4804 /// @return The title of the currently selected song\, movie\, game in a container.
4805 /// <p><hr>
4806 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
4807 /// to support games
4808 /// <p>
4809 /// }
4810 /// \table_row3{ <b>`ListItem.OriginalTitle`</b>,
4811 /// \anchor ListItem_OriginalTitle
4812 /// _string_,
4813 /// @return The original title of the currently selected movie in a container.
4814 /// <p>
4815 /// }
4816 /// \table_row3{ <b>`ListItem.SortLetter`</b>,
4817 /// \anchor ListItem_SortLetter
4818 /// _string_,
4819 /// @return The first letter of the current file in a container.
4820 /// <p>
4821 /// }
4822 /// \table_row3{ <b>`ListItem.TrackNumber`</b>,
4823 /// \anchor ListItem_TrackNumber
4824 /// _string_,
4825 /// @return The track number of the currently selected song in a container.
4826 /// <p>
4827 /// }
4828 /// \table_row3{ <b>`ListItem.Artist`</b>,
4829 /// \anchor ListItem_Artist
4830 /// _string_,
4831 /// @return The artist of the currently selected song in a container.
4832 /// <p>
4833 /// }
4834 /// \table_row3{ <b>`ListItem.AlbumArtist`</b>,
4835 /// \anchor ListItem_AlbumArtist
4836 /// _string_,
4837 /// @return The artist of the currently selected album in a list.
4838 /// <p>
4839 /// }
4840 /// \table_row3{ <b>`ListItem.Property(Artist_Sortname)`</b>,
4841 /// \anchor ListItem_Property_Artist_Sortname
4842 /// _string_,
4843 /// @return The sortname of the currently selected Artist.
4844 /// <p><hr>
4845 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Sortname `ListItem.Property(Artist_Sortname)`\endlink
4846 /// <p>
4847 /// }
4848 /// \table_row3{ <b>`ListItem.Property(Artist_Type)`</b>,
4849 /// \anchor ListItem_Property_Artist_Type
4850 /// _string_,
4851 /// @return The type of the currently selected Artist - person\, group\, orchestra\, choir etc.
4852 /// <p><hr>
4853 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Type `ListItem.Property(Artist_Type)`\endlink
4854 /// <p>
4855 /// }
4856 /// \table_row3{ <b>`ListItem.Property(Artist_Gender)`</b>,
4857 /// \anchor ListItem_Property_Artist_Gender
4858 /// _string_,
4859 /// @return The Gender of the currently selected Artist - male\, female\, other.
4860 /// <p><hr>
4861 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Gender `ListItem.Property(Artist_Gender)`\endlink
4862 /// <p>
4863 /// }
4864 /// \table_row3{ <b>`ListItem.Property(Artist_Disambiguation)`</b>,
4865 /// \anchor ListItem_Property_Artist_Disambiguation
4866 /// _string_,
4867 /// @return A Brief description of the currently selected Artist that differentiates them
4868 /// from others with the same name.
4869 /// <p><hr>
4870 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Disambiguation `ListItem.Property(Artist_Disambiguation)`\endlink
4871 /// <p>
4872 /// }
4873 /// \table_row3{ <b>`ListItem.Property(Artist_Born)`</b>,
4874 /// \anchor ListItem_Property_Artist_Born
4875 /// _string_,
4876 /// @return The date of Birth of the currently selected Artist.
4877 /// <p>
4878 /// }
4879 /// \table_row3{ <b>`ListItem.Property(Artist_Died)`</b>,
4880 /// \anchor ListItem_Property_Artist_Died
4881 /// _string_,
4882 /// @return The date of Death of the currently selected Artist.
4883 /// <p>
4884 /// }
4885 /// \table_row3{ <b>`ListItem.Property(Artist_Formed)`</b>,
4886 /// \anchor ListItem_Property_Artist_Formed
4887 /// _string_,
4888 /// @return The formation date of the currently selected Band.
4889 /// <p>
4890 /// }
4891 /// \table_row3{ <b>`ListItem.Property(Artist_Disbanded)`</b>,
4892 /// \anchor ListItem_Property_Artist_Disbanded
4893 /// _string_,
4894 /// @return The disbanding date of the currently selected Band.
4895 /// <p>
4896 /// }
4897 /// \table_row3{ <b>`ListItem.Property(Artist_YearsActive)`</b>,
4898 /// \anchor ListItem_Property_Artist_YearsActive
4899 /// _string_,
4900 /// @return The years the currently selected artist has been active.
4901 /// <p>
4902 /// }
4903 /// \table_row3{ <b>`ListItem.Property(Artist_Instrument)`</b>,
4904 /// \anchor ListItem_Property_Artist_Instrument
4905 /// _string_,
4906 /// @return The instruments played by the currently selected artist.
4907 /// <p>
4908 /// }
4909 /// \table_row3{ <b>`ListItem.Property(Artist_Description)`</b>,
4910 /// \anchor ListItem_Property_Artist_Description
4911 /// _string_,
4912 /// @return A biography of the currently selected artist.
4913 /// <p>
4914 /// }
4915 /// \table_row3{ <b>`ListItem.Property(Artist_Mood)`</b>,
4916 /// \anchor ListItem_Property_Artist_Mood
4917 /// _string_,
4918 /// @return The moods of the currently selected artist.
4919 /// <p>
4920 /// }
4921 /// \table_row3{ <b>`ListItem.Property(Artist_Style)`</b>,
4922 /// \anchor ListItem_Property_Artist_Style
4923 /// _string_,
4924 /// @return The styles of the currently selected artist.
4925 /// <p>
4926 /// }
4927 /// \table_row3{ <b>`ListItem.Property(Artist_Genre)`</b>,
4928 /// \anchor ListItem_Property_Artist_Genre
4929 /// _string_,
4930 /// @return The genre of the currently selected artist.
4931 /// <p>
4932 /// }
4933 /// \table_row3{ <b>`ListItem.Album`</b>,
4934 /// \anchor ListItem_Album
4935 /// _string_,
4936 /// @return The album of the currently selected song in a container.
4937 /// <p>
4938 /// }
4939 /// \table_row3{ <b>`ListItem.Property(Album_Mood)`</b>,
4940 /// \anchor ListItem_Property_Album_Mood
4941 /// _string_,
4942 /// @return The moods of the currently selected Album.
4943 /// <p>
4944 /// }
4945 /// \table_row3{ <b>`ListItem.Property(Album_Style)`</b>,
4946 /// \anchor ListItem_Property_Album_Style
4947 /// _string_,
4948 /// @return The styles of the currently selected Album.
4949 /// <p>
4950 /// }
4951 /// \table_row3{ <b>`ListItem.Property(Album_Theme)`</b>,
4952 /// \anchor ListItem_Property_Album_Theme
4953 /// _string_,
4954 /// @return The themes of the currently selected Album.
4955 /// <p>
4956 /// }
4957 /// \table_row3{ <b>`ListItem.Property(Album_Type)`</b>,
4958 /// \anchor ListItem_Property_Album_Type
4959 /// _string_,
4960 /// @return The Album Type (e.g. compilation\, enhanced\, explicit lyrics) of
4961 /// the currently selected Album.
4962 /// <p>
4963 /// }
4964 /// \table_row3{ <b>`ListItem.Property(Album_Label)`</b>,
4965 /// \anchor ListItem_Property_Album_Label
4966 /// _string_,
4967 /// @return The record label of the currently selected Album.
4968 /// <p>
4969 /// }
4970 /// \table_row3{ <b>`ListItem.Property(Album_Description)`</b>,
4971 /// \anchor ListItem_Property_Album_Description
4972 /// _string_,
4973 /// @return A review of the currently selected Album.
4974 /// <p>
4975 /// }
4976 /// \table_row3{ <b>`ListItem.Property(Album_Totaldiscs)`</b>,
4977 /// \anchor ListItem_Property_Album_Totaldiscs
4978 /// _string_,
4979 /// @return The total number of discs belonging to an album.
4980 /// <p><hr>
4981 /// @skinning_v19 **[New Infolabel]** \link ListItem.Property(Album_Totaldiscs) `ListItem.Property(Album_Totaldiscs)`\endlink
4982 /// <p>
4983 /// }
4984 /// \table_row3{ <b>`ListItem.Property(Album_Isboxset)`</b>,
4985 /// \anchor ListItem_Property_Album_Isboxset
4986 /// _string_,
4987 /// @return **True** if the album is a boxset.
4988 /// <p><hr>
4989 /// @skinning_v19 **[New Infobool]** \link ListItem.Property(Album_Isboxset) `ListItem.Property(Album_Isboxset)`\endlink
4990 /// <p>
4991 /// }
4992 /// \table_row3{ <b>`ListItem.Property(Album_Duration)`</b>,
4993 /// \anchor ListItem_Property_Album_Duration
4994 /// _string_,
4995 /// @return The duration of the album in HH:MM:SS.
4996 /// <p><hr>
4997 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_Album_Duration `ListItem.Property(Album_Duration)`\endlink
4998 /// <p>
4999 /// }
5000 /// \table_row3{ <b>`ListItem.DiscNumber`</b>,
5001 /// \anchor ListItem_DiscNumber
5002 /// _string_,
5003 /// @return The disc number of the currently selected song in a container.
5004 /// <p>
5005 /// }
5006 /// \table_row3{ <b>`ListItem.Year`</b>,
5007 /// \anchor ListItem_Year
5008 /// _string_,
5009 /// @return The year of the currently selected song\, album\, movie\, game in a
5010 /// container.
5011 /// <p><hr>
5012 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
5013 /// to support games
5014 /// <p>
5015 /// }
5016 /// \table_row3{ <b>`ListItem.Premiered`</b>,
5017 /// \anchor ListItem_Premiered
5018 /// _string_,
5019 /// @return The release/aired date of the currently selected episode\, show\,
5020 /// movie or EPG item in a container.
5021 /// <p><hr>
5022 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Premiered `ListItem.Premiered`\endlink
5023 /// now also available for EPG items.
5024 /// <p>
5025 /// }
5026 /// \table_row3{ <b>`ListItem.Genre`</b>,
5027 /// \anchor ListItem_Genre
5028 /// _string_,
5029 /// @return The genre of the currently selected song\, album or movie in a
5030 /// container.
5031 /// <p>
5032 /// }
5033 /// \table_row3{ <b>`ListItem.Contributors`</b>,
5034 /// \anchor ListItem_Contributors
5035 /// _string_,
5036 /// @return The list of all people who've contributed to the selected song.
5037 /// <p><hr>
5038 /// @skinning_v17 **[New Infolabel]** \link ListItem_Contributors `ListItem.Contributors`\endlink
5039 /// <p>
5040 /// }
5041 /// \table_row3{ <b>`ListItem.ContributorAndRole`</b>,
5042 /// \anchor ListItem_ContributorAndRole
5043 /// _string_,
5044 /// @return The list of all people and their role who've contributed to the selected song.
5045 /// <p><hr>
5046 /// @skinning_v17 **[New Infolabel]** \link ListItem_ContributorAndRole `ListItem.ContributorAndRole`\endlink
5047 /// <p>
5048 /// }
5049 /// \table_row3{ <b>`ListItem.Director`</b>,
5050 /// \anchor ListItem_Director
5051 /// _string_,
5052 /// @return The director of the currently selected movie in a container.
5053 /// <p><hr>
5054 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Director `ListItem.Director`\endlink
5055 /// also supports EPG.
5056 /// <p>
5057 /// }
5058 /// \table_row3{ <b>`ListItem.Country`</b>,
5059 /// \anchor ListItem_Country
5060 /// _string_,
5061 /// @return The production country of the currently selected movie in a
5062 /// container.
5063 /// <p>
5064 /// }
5065 /// \table_row3{ <b>`ListItem.Episode`</b>,
5066 /// \anchor ListItem_Episode
5067 /// _string_,
5068 /// @return The episode number value for the currently selected episode. It
5069 /// also returns the number of total\, watched or unwatched episodes for the
5070 /// currently selected tvshow or season\, based on the the current watched
5071 /// filter.
5072 /// <p><hr>
5073 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Episode `ListItem.Episode`\endlink
5074 /// also supports EPG.
5075 /// <p>
5076 /// }
5077 /// \table_row3{ <b>`ListItem.Season`</b>,
5078 /// \anchor ListItem_Season
5079 /// _string_,
5080 /// @return The season value for the currently selected tvshow.
5081 /// <p><hr>
5082 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Season `ListItem.Season`\endlink
5083 /// also supports EPG.
5084 /// <p>
5085 /// }
5086 /// \table_row3{ <b>`ListItem.TVShowTitle`</b>,
5087 /// \anchor ListItem_TVShowTitle
5088 /// _string_,
5089 /// @return The name value for the currently selected tvshow in the season and
5090 /// episode depth of the video library.
5091 /// <p>
5092 /// }
5093 /// \table_row3{ <b>`ListItem.Property(TotalSeasons)`</b>,
5094 /// \anchor ListItem_Property_TotalSeasons
5095 /// _string_,
5096 /// @return The total number of seasons for the currently selected tvshow.
5097 /// <p>
5098 /// }
5099 /// \table_row3{ <b>`ListItem.Property(TotalEpisodes)`</b>,
5100 /// \anchor ListItem_Property_TotalEpisodes
5101 /// _string_,
5102 /// @return the total number of episodes for the currently selected tvshow or
5103 /// season.
5104 /// <p>
5105 /// }
5106 /// \table_row3{ <b>`ListItem.Property(WatchedEpisodes)`</b>,
5107 /// \anchor ListItem_Property_WatchedEpisodes
5108 /// _string_,
5109 /// @return The number of watched episodes for the currently selected tvshow
5110 /// or season.
5111 /// <p>
5112 /// }
5113 /// \table_row3{ <b>`ListItem.Property(UnWatchedEpisodes)`</b>,
5114 /// \anchor ListItem_Property_UnWatchedEpisodes
5115 /// _string_,
5116 /// @return The number of unwatched episodes for the currently selected tvshow
5117 /// or season.
5118 /// <p>
5119 /// }
5120 /// \table_row3{ <b>`ListItem.Property(NumEpisodes)`</b>,
5121 /// \anchor ListItem_Property_NumEpisodes
5122 /// _string_,
5123 /// @return The number of total\, watched or unwatched episodes for the
5124 /// currently selected tvshow or season\, based on the the current watched filter.
5125 /// <p>
5126 /// }
5127 /// \table_row3{ <b>`ListItem.Property(WatchedEpisodePercent)`</b>,
5128 /// \anchor ListItem_Property_WatchedEpisodePercent
5129 /// _string_,
5130 /// @return The percentage of watched episodes in the tvshow (watched/total*100) or season.
5131 /// <p><hr>
5132 /// @skinning_v20 **[New Infolabel]** \link ListItem_Property_WatchedEpisodePercent `ListItem.Property(WatchedEpisodePercent)`\endlink
5133 /// <p>
5134 /// }
5135 /// \table_row3{ <b>`ListItem.PictureAperture`</b>,
5136 /// \anchor ListItem_PictureAperture
5137 /// _string_,
5138 /// @return The F-stop used to take the selected picture.
5139 /// @note This is the value of the EXIF FNumber tag (hex code 0x829D).
5140 /// <p>
5141 /// }
5142 /// \table_row3{ <b>`ListItem.PictureAuthor`</b>,
5143 /// \anchor ListItem_PictureAuthor
5144 /// _string_,
5145 /// @return The name of the person involved in writing about the selected picture.
5146 /// @note This is the value of the IPTC Writer tag (hex code 0x7A).
5147 /// <p><hr>
5148 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureAuthor `ListItem.PictureAuthor`\endlink
5149 /// <p>
5150 /// }
5151 /// \table_row3{ <b>`ListItem.PictureByline`</b>,
5152 /// \anchor ListItem_PictureByline
5153 /// _string_,
5154 /// @return The name of the person who created the selected picture.
5155 /// @note This is the value of the IPTC Byline tag (hex code 0x50).
5156 /// <p><hr>
5157 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureByline `ListItem.PictureByline`\endlink
5158 /// <p>
5159 /// }
5160 /// \table_row3{ <b>`ListItem.PictureBylineTitle`</b>,
5161 /// \anchor ListItem_PictureBylineTitle
5162 /// _string_,
5163 /// @return The title of the person who created the selected picture.
5164 /// @note This is the value of the IPTC BylineTitle tag (hex code 0x55).
5165 /// <p><hr>
5166 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureBylineTitle `ListItem.PictureBylineTitle`\endlink
5167 /// <p>
5168 /// }
5169 /// \table_row3{ <b>`ListItem.PictureCamMake`</b>,
5170 /// \anchor ListItem_PictureCamMake
5171 /// _string_,
5172 /// @return The manufacturer of the camera used to take the selected picture.
5173 /// @note This is the value of the EXIF Make tag (hex code 0x010F).
5174 /// <p>
5175 /// }
5176 /// \table_row3{ <b>`ListItem.PictureCamModel`</b>,
5177 /// \anchor ListItem_PictureCamModel
5178 /// _string_,
5179 /// @return The manufacturer's model name or number of the camera used to take
5180 /// the selected picture.
5181 /// @note This is the value of the EXIF Model tag (hex code 0x0110).
5182 /// <p>
5183 /// }
5184 /// \table_row3{ <b>`ListItem.PictureCaption`</b>,
5185 /// \anchor ListItem_PictureCaption
5186 /// _string_,
5187 /// @return A description of the selected picture.
5188 /// @note This is the value of the IPTC Caption tag (hex code 0x78).
5189 /// <p>
5190 /// }
5191 /// \table_row3{ <b>`ListItem.PictureCategory`</b>,
5192 /// \anchor ListItem_PictureCategory
5193 /// _string_,
5194 /// @return The subject of the selected picture as a category code.
5195 /// @note This is the value of the IPTC Category tag (hex code 0x0F).
5196 /// <p><hr>
5197 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCategory `ListItem.PictureCategory`\endlink
5198 /// <p>
5199 /// }
5200 /// \table_row3{ <b>`ListItem.PictureCCDWidth`</b>,
5201 /// \anchor ListItem_PictureCCDWidth
5202 /// _string_,
5203 /// @return The width of the CCD in the camera used to take the selected
5204 /// picture.
5205 /// @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
5206 /// <p><hr>
5207 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCCDWidth `ListItem.PictureCCDWidth`\endlink
5208 /// <p>
5209 /// }
5210 /// \table_row3{ <b>`ListItem.PictureCity`</b>,
5211 /// \anchor ListItem_PictureCity
5212 /// _string_,
5213 /// @return The city where the selected picture was taken.
5214 /// @note This is the value of the IPTC City tag (hex code 0x5A).
5215 /// <p><hr>
5216 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCity `ListItem.PictureCity`\endlink
5217 /// <p>
5218 /// }
5219 /// \table_row3{ <b>`ListItem.PictureColour`</b>,
5220 /// \anchor ListItem_PictureColour
5221 /// _string_,
5222 /// @return Whether the selected picture is "Colour" or "Black and White".
5223 /// <p>
5224 /// @deprecated \link ListItem_PictureColour `ListItem.PictureColour`\endlink is deprecated and will be removed in future Kodi versions
5225 /// <p><hr>
5226 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureColour `ListItem.PictureColour`\endlink
5227 /// <p>
5228 /// }
5229 /// \table_row3{ <b>`ListItem.PictureComment`</b>,
5230 /// \anchor ListItem_PictureComment
5231 /// _string_,
5232 /// @return A description of the selected picture.
5233 /// @note This is the value of the
5234 /// EXIF User Comment tag (hex code 0x9286). This is the same value as
5235 /// \ref Slideshow_SlideComment "Slideshow.SlideComment".
5236 /// <p>
5237 /// }
5238 /// \table_row3{ <b>`ListItem.PictureCopyrightNotice`</b>,
5239 /// \anchor ListItem_PictureCopyrightNotice
5240 /// _string_,
5241 /// @return The copyright notice of the selected picture.
5242 /// @note This is the value of the IPTC Copyright tag (hex code 0x74).
5243 /// <p><hr>
5244 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCopyrightNotice `ListItem.PictureCopyrightNotice`\endlink
5245 /// <p>
5246 /// }
5247 /// \table_row3{ <b>`ListItem.PictureCountry`</b>,
5248 /// \anchor ListItem_PictureCountry
5249 /// _string_,
5250 /// @return The full name of the country where the selected picture was taken.
5251 /// @note This is the value of the IPTC CountryName tag (hex code 0x65).
5252 /// <p><hr>
5253 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountry `ListItem.PictureCountry`\endlink
5254 /// <p>
5255 /// }
5256 /// \table_row3{ <b>`ListItem.PictureCountryCode`</b>,
5257 /// \anchor ListItem_PictureCountryCode
5258 /// _string_,
5259 /// @return The country code of the country where the selected picture was
5260 /// taken.
5261 /// @note This is the value of the IPTC CountryCode tag (hex code 0x64).
5262 /// <p><hr>
5263 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountryCode `ListItem.PictureCountryCode`\endlink
5264 /// <p>
5265 /// }
5266 /// \table_row3{ <b>`ListItem.PictureCredit`</b>,
5267 /// \anchor ListItem_PictureCredit
5268 /// _string_,
5269 /// @return Who provided the selected picture.
5270 /// @note This is the value of the IPTC Credit tag (hex code 0x6E).
5271 /// <p><hr>
5272 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCredit `ListItem.PictureCredit`\endlink
5273 /// <p>
5274 /// }
5275 /// \table_row3{ <b>`ListItem.PictureDate`</b>,
5276 /// \anchor ListItem_PictureDate
5277 /// _string_,
5278 /// @return The localized date of the selected picture. The short form of the
5279 /// date is used.
5280 /// @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003)
5281 /// is preferred. If the DateTimeOriginal tag is not found\, the value of
5282 /// DateTimeDigitized (hex code 0x9004) or of DateTime (hex code 0x0132) might
5283 /// be used.
5284 /// <p><hr>
5285 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDate `ListItem.PictureDate`\endlink
5286 /// <p>
5287 /// }
5288 /// \table_row3{ <b>`ListItem.PictureDatetime`</b>,
5289 /// \anchor ListItem_PictureDatetime
5290 /// _string_,
5291 /// @return The date/timestamp of the selected picture. The localized short form
5292 /// of the date and time is used.
5293 /// @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003) is preferred.
5294 /// If the DateTimeOriginal tag is not found\, the value of DateTimeDigitized
5295 /// (hex code 0x9004) or of DateTime (hex code 0x0132) might be used.
5296 /// <p><hr>
5297 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDatetime `ListItem.PictureDatetime`\endlink
5298 /// <p>
5299 /// }
5300 /// \table_row3{ <b>`ListItem.PictureDesc`</b>,
5301 /// \anchor ListItem_PictureDesc
5302 /// _string_,
5303 /// @return A short description of the selected picture. The SlideComment\,
5304 /// EXIFComment\, or Caption values might contain a longer description.
5305 /// @note This is the value of the EXIF ImageDescription tag (hex code 0x010E).
5306 /// <p>
5307 /// }
5308 /// \table_row3{ <b>`ListItem.PictureDigitalZoom`</b>,
5309 /// \anchor ListItem_PictureDigitalZoom
5310 /// _string_,
5311 /// @return The digital zoom ratio when the selected picture was taken.
5312 /// @note This is the value of the EXIF DigitalZoomRatio tag (hex code 0xA404).
5313 /// <p><hr>
5314 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDigitalZoom `ListItem.PictureDigitalZoom`\endlink
5315 /// <p>
5316 /// }
5317 /// \table_row3{ <b>`ListItem.PictureExpMode`</b>,
5318 /// \anchor ListItem_PictureExpMode
5319 /// _string_,
5320 /// @return The exposure mode of the selected picture.
5321 /// The possible values are:
5322 /// - <b>"Automatic"</b>
5323 /// - <b>"Manual"</b>
5324 /// - <b>"Auto bracketing"</b>
5325 /// @note This is the value of the EXIF ExposureMode tag (hex code 0xA402).
5326 /// <p>
5327 /// }
5328 /// \table_row3{ <b>`ListItem.PictureExposure`</b>,
5329 /// \anchor ListItem_PictureExposure
5330 /// _string_,
5331 /// @return The class of the program used by the camera to set exposure when
5332 /// the selected picture was taken. Values include:
5333 /// - <b>"Manual"</b>
5334 /// - <b>"Program (Auto)"</b>
5335 /// - <b>"Aperture priority (Semi-Auto)"</b>
5336 /// - <b>"Shutter priority (semi-auto)"</b>
5337 /// - etc
5338 /// @note This is the value of the EXIF ExposureProgram tag (hex code 0x8822).
5339 /// <p><hr>
5340 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposure `ListItem.PictureExposure`\endlink
5341 /// <p>
5342 /// }
5343 /// \table_row3{ <b>`ListItem.PictureExposureBias`</b>,
5344 /// \anchor ListItem_PictureExposureBias
5345 /// _string_,
5346 /// @return The exposure bias of the selected picture.
5347 /// Typically this is a number between -99.99 and 99.99.
5348 /// @note This is the value of the EXIF ExposureBiasValue tag (hex code 0x9204).
5349 /// <p><hr>
5350 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposureBias `ListItem.PictureExposureBias`\endlink
5351 /// <p>
5352 /// }
5353 /// \table_row3{ <b>`ListItem.PictureExpTime`</b>,
5354 /// \anchor ListItem_PictureExpTime
5355 /// _string_,
5356 /// @return The exposure time of the selected picture\, in seconds.
5357 /// @note This is the value of the EXIF ExposureTime tag (hex code 0x829A).
5358 /// If the ExposureTime tag is not found\, the ShutterSpeedValue tag (hex code 0x9201)
5359 /// might be used.
5360 /// <p>
5361 /// }
5362 /// \table_row3{ <b>`ListItem.PictureFlashUsed`</b>,
5363 /// \anchor ListItem_PictureFlashUsed
5364 /// _string_,
5365 /// @return The status of flash when the selected picture was taken. The value
5366 /// will be either "Yes" or "No"\, and might include additional information.
5367 /// @note This is the value of the EXIF Flash tag (hex code 0x9209).
5368 /// <p><hr>
5369 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureFlashUsed `ListItem.PictureFlashUsed`\endlink
5370 /// <p>
5371 /// }
5372 /// \table_row3{ <b>`ListItem.PictureFocalLen`</b>,
5373 /// \anchor ListItem_PictureFocalLen
5374 /// _string_,
5375 /// @return The lens focal length of the selected picture.
5376 /// <p>
5377 /// }
5378 /// \table_row3{ <b>`ListItem.PictureFocusDist`</b>,
5379 /// \anchor ListItem_PictureFocusDist
5380 /// _string_,
5381 /// @return The focal length of the lens\, in mm.
5382 /// @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
5383 /// }
5384 /// \table_row3{ <b>`ListItem.PictureGPSLat`</b>,
5385 /// \anchor ListItem_PictureGPSLat
5386 /// _string_,
5387 /// @return The latitude where the selected picture was taken (degrees\,
5388 /// minutes\, seconds North or South).
5389 /// @note This is the value of the EXIF GPSInfo.GPSLatitude and GPSInfo.GPSLatitudeRef tags.
5390 /// <p>
5391 /// }
5392 /// \table_row3{ <b>`ListItem.PictureGPSLon`</b>,
5393 /// \anchor ListItem_PictureGPSLon
5394 /// _string_,
5395 /// @return The longitude where the selected picture was taken (degrees\,
5396 /// minutes\, seconds East or West).
5397 /// @note This is the value of the EXIF GPSInfo.GPSLongitude and GPSInfo.GPSLongitudeRef tags.
5398 /// <p>
5399 /// }
5400 /// \table_row3{ <b>`ListItem.PictureGPSAlt`</b>,
5401 /// \anchor ListItem_PictureGPSAlt
5402 /// _string_,
5403 /// @return The altitude in meters where the selected picture was taken.
5404 /// @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
5405 /// <p>
5406 /// }
5407 /// \table_row3{ <b>`ListItem.PictureHeadline`</b>,
5408 /// \anchor ListItem_PictureHeadline
5409 /// _string_,
5410 /// @return A synopsis of the contents of the selected picture.
5411 /// @note This is the value of the IPTC Headline tag (hex code 0x69).
5412 /// <p><hr>
5413 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureHeadline `ListItem.PictureHeadline`\endlink
5414 /// <p>
5415 /// }
5416 /// \table_row3{ <b>`ListItem.PictureImageType`</b>,
5417 /// \anchor ListItem_PictureImageType
5418 /// _string_,
5419 /// @return The color components of the selected picture.
5420 /// @note This is the value of the IPTC ImageType tag (hex code 0x82).
5421 /// <p><hr>
5422 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureImageType `ListItem.PictureImageType`\endlink
5423 /// <p>
5424 /// }
5425 /// \table_row3{ <b>`ListItem.PictureIPTCDate`</b>,
5426 /// \anchor ListItem_PictureIPTCDate
5427 /// _string_,
5428 /// @return The date when the intellectual content of the selected picture was
5429 /// created\, rather than when the picture was created.
5430 /// @note This is the value of the IPTC DateCreated tag (hex code 0x37).
5431 /// <p><hr>
5432 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCDate `ListItem.PictureIPTCDate`\endlink
5433 /// <p>
5434 /// }
5435 /// \table_row3{ <b>`ListItem.PictureIPTCTime`</b>,
5436 /// \anchor ListItem_PictureIPTCTime
5437 /// _string_,
5438 /// @return The time when the intellectual content of the selected picture was
5439 /// created\, rather than when the picture was created.
5440 /// @note This is the value of the IPTC TimeCreated tag (hex code 0x3C).
5441 /// <p><hr>
5442 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCTime `ListItem.PictureIPTCTime`\endlink
5443 /// <p>
5444 /// }
5445 /// \table_row3{ <b>`ListItem.PictureISO`</b>,
5446 /// \anchor ListItem_PictureISO
5447 /// _string_,
5448 /// @return The ISO speed of the camera when the selected picture was taken.
5449 /// @note This is the value of the EXIF ISOSpeedRatings tag (hex code 0x8827).
5450 /// <p>
5451 /// }
5452 /// \table_row3{ <b>`ListItem.PictureKeywords`</b>,
5453 /// \anchor ListItem_PictureKeywords
5454 /// _string_,
5455 /// @return The keywords assigned to the selected picture.
5456 /// @note This is the value of the IPTC Keywords tag (hex code 0x19).
5457 /// <p>
5458 /// }
5459 /// \table_row3{ <b>`ListItem.PictureLightSource`</b>,
5460 /// \anchor ListItem_PictureLightSource
5461 /// _string_,
5462 /// @return The kind of light source when the picture was taken. Possible
5463 /// values include:
5464 /// - <b>"Daylight"</b>
5465 /// - <b>"Fluorescent"</b>
5466 /// - <b>"Incandescent"</b>
5467 /// - etc
5468 /// @note This is the value of the EXIF LightSource tag (hex code 0x9208).
5469 /// <p><hr>
5470 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureLightSource `ListItem.PictureLightSource`\endlink
5471 /// <p>
5472 /// }
5473 /// \table_row3{ <b>`ListItem.PictureLongDate`</b>,
5474 /// \anchor ListItem_PictureLongDate
5475 /// _string_,
5476 /// @return Only the localized date of the selected picture. The long form of
5477 /// the date is used.
5478 /// @note The value of the EXIF DateTimeOriginal tag (hex code
5479 /// 0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
5480 /// value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
5481 /// 0x0132) might be used.
5482 /// <p><hr>
5483 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureLongDate `ListItem.PictureLongDate`\endlink
5484 /// <p>
5485 /// }
5486 /// \table_row3{ <b>`ListItem.PictureLongDatetime`</b>,
5487 /// \anchor ListItem_PictureLongDatetime
5488 /// _string_,
5489 /// @return The date/timestamp of the selected picture. The localized long
5490 /// form of the date and time is used.
5491 /// @note The value of the EXIF DateTimeOriginal
5492 /// tag (hex code 0x9003) is preferred. if the DateTimeOriginal tag is not
5493 /// found\, the value of DateTimeDigitized (hex code 0x9004) or of DateTime
5494 /// (hex code 0x0132) might be used.
5495 /// <p>
5496 /// }
5497 /// \table_row3{ <b>`ListItem.PictureMeteringMode`</b>,
5498 /// \anchor ListItem_PictureMeteringMode
5499 /// _string_,
5500 /// @return The metering mode used when the selected picture was taken. The
5501 /// possible values are:
5502 /// - <b>"Center weight"</b>
5503 /// - <b>"Spot"</b>
5504 /// - <b>"Matrix"</b>
5505 /// @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
5506 /// <p><hr>
5507 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureMeteringMode `ListItem.PictureMeteringMode`\endlink
5508 /// <p>
5509 /// }
5510 /// \table_row3{ <b>`ListItem.PictureObjectName`</b>,
5511 /// \anchor ListItem_PictureObjectName
5512 /// _string_,
5513 /// @return A shorthand reference for the selected picture.
5514 /// @note This is the value of the IPTC ObjectName tag (hex code 0x05).
5515 /// <p><hr>
5516 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureObjectName `ListItem.PictureObjectName`\endlink
5517 /// <p>
5518 /// }
5519 /// \table_row3{ <b>`ListItem.PictureOrientation`</b>,
5520 /// \anchor ListItem_PictureOrientation
5521 /// _string_,
5522 /// @return The orientation of the selected picture. Possible values are:
5523 /// - <b>"Top Left"</b>
5524 /// - <b>"Top Right"</b>
5525 /// - <b>"Left Top"</b>
5526 /// - <b>"Right Bottom"</b>
5527 /// - etc
5528 /// @note This is the value of the EXIF Orientation tag (hex code 0x0112).
5529 /// <p><hr>
5530 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureOrientation `ListItem.PictureOrientation`\endlink
5531 /// <p>
5532 /// }
5533 /// \table_row3{ <b>`ListItem.PicturePath`</b>,
5534 /// \anchor ListItem_PicturePath
5535 /// _string_,
5536 /// @return The filename and path of the selected picture.
5537 /// <p>
5538 /// }
5539 /// \table_row3{ <b>`ListItem.PictureProcess`</b>,
5540 /// \anchor ListItem_PictureProcess
5541 /// _string_,
5542 /// @return The process used to compress the selected picture.
5543 /// <p>
5544 /// @deprecated \link ListItem_PictureProcess `ListItem.PictureProcess`\endlink is deprecated and will be removed in future Kodi versions
5545 /// <p><hr>
5546 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureProcess `ListItem.PictureProcess`\endlink
5547 /// <p>
5548 /// }
5549 /// \table_row3{ <b>`ListItem.PictureReferenceService`</b>,
5550 /// \anchor ListItem_PictureReferenceService
5551 /// _string_,
5552 /// @return The Service Identifier of a prior envelope to which the selected
5553 /// picture refers.
5554 /// @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
5555 /// <p><hr>
5556 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureReferenceService `ListItem.PictureReferenceService`\endlink
5557 /// <p>
5558 /// }
5559 /// \table_row3{ <b>`ListItem.PictureResolution`</b>,
5560 /// \anchor ListItem_PictureResolution
5561 /// _string_,
5562 /// @return The dimensions of the selected picture.
5563 /// <p>
5564 /// }
5565 /// \table_row3{ <b>`ListItem.PictureSource`</b>,
5566 /// \anchor ListItem_PictureSource
5567 /// _string_,
5568 /// @return The original owner of the selected picture.
5569 /// @note This is the value of the IPTC Source tag (hex code 0x73).
5570 /// <p><hr>
5571 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSource `ListItem.PictureSource`\endlink
5572 /// <p>
5573 /// }
5574 /// \table_row3{ <b>`ListItem.PictureSpecialInstructions`</b>,
5575 /// \anchor ListItem_PictureSpecialInstructions
5576 /// _string_,
5577 /// @return Other editorial instructions concerning the use of the selected
5578 /// picture.
5579 /// @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
5580 /// <p><hr>
5581 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSpecialInstructions `ListItem.PictureSpecialInstructions`\endlink
5582 /// <p>
5583 /// }
5584 /// \table_row3{ <b>`ListItem.PictureState`</b>,
5585 /// \anchor ListItem_PictureState
5586 /// _string_,
5587 /// @return The State/Province where the selected picture was taken.
5588 /// @note This is the value of the IPTC ProvinceState tag (hex code 0x5F).
5589 /// <p><hr>
5590 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureState `ListItem.PictureState`\endlink
5591 /// <p>
5592 /// }
5593 /// \table_row3{ <b>`ListItem.PictureSublocation`</b>,
5594 /// \anchor ListItem_PictureSublocation
5595 /// _string_,
5596 /// @return The location within a city where the selected picture was taken -
5597 /// might indicate the nearest landmark.
5598 /// @note This is the value of the IPTC SubLocation tag (hex code 0x5C).
5599 /// <p><hr>
5600 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSublocation `ListItem.PictureSublocation`\endlink
5601 /// <p>
5602 /// }
5603 /// \table_row3{ <b>`ListItem.PictureSupplementalCategories`</b>,
5604 /// \anchor ListItem_PictureSupplementalCategories
5605 /// _string_,
5606 /// @return A supplemental category codes to further refine the subject of the
5607 /// selected picture.
5608 /// @note This is the value of the IPTC SuppCategory tag (hex code 0x14).
5609 /// <p><hr>
5610 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSupplementalCategories `ListItem.PictureSupplementalCategories`\endlink
5611 /// <p>
5612 /// }
5613 /// \table_row3{ <b>`ListItem.PictureTransmissionReference`</b>,
5614 /// \anchor ListItem_PictureTransmissionReference
5615 /// _string_,
5616 /// @return A code representing the location of original transmission of the
5617 /// selected picture.
5618 /// @note This is the value of the IPTC TransmissionReference tag (hex code 0x67).
5619 /// <p><hr>
5620 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureTransmissionReference `ListItem.PictureTransmissionReference`\endlink
5621 /// <p>
5622 /// }
5623 /// \table_row3{ <b>`ListItem.PictureUrgency`</b>,
5624 /// \anchor ListItem_PictureUrgency
5625 /// _string_,
5626 /// @return The urgency of the selected picture. Values are 1-9.
5627 /// @note The "1" is most urgent. Some image management programs use urgency to indicate
5628 /// picture rating\, where urgency "1" is 5 stars and urgency "5" is 1 star.
5629 /// Urgencies 6-9 are not used for rating. This is the value of the IPTC
5630 /// Urgency tag (hex code 0x0A).
5631 /// <p><hr>
5632 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureUrgency `ListItem.PictureUrgency`\endlink
5633 /// <p>
5634 /// }
5635 /// \table_row3{ <b>`ListItem.PictureWhiteBalance`</b>,
5636 /// \anchor ListItem_PictureWhiteBalance
5637 /// _string_,
5638 /// @return The white balance mode set when the selected picture was taken.
5639 /// The possible values are:
5640 /// - <b>"Manual"</b>
5641 /// - <b>"Auto"</b>
5642 /// @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
5643 /// <p><hr>
5644 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureWhiteBalance `ListItem.PictureWhiteBalance`\endlink
5645 /// <p>
5646 /// }
5647 /// \table_row3{ <b>`ListItem.FileName`</b>,
5648 /// \anchor ListItem_FileName
5649 /// _string_,
5650 /// @return The filename of the currently selected song or movie in a container.
5651 /// <p>
5652 /// }
5653 /// \table_row3{ <b>`ListItem.Path`</b>,
5654 /// \anchor ListItem_Path
5655 /// _string_,
5656 /// @return The complete path of the currently selected song or movie in a
5657 /// container.
5658 /// <p>
5659 /// }
5660 /// \table_row3{ <b>`ListItem.FolderName`</b>,
5661 /// \anchor ListItem_FolderName
5662 /// _string_,
5663 /// @return The top most folder of the path of the currently selected song or
5664 /// movie in a container.
5665 /// <p>
5666 /// }
5667 /// \table_row3{ <b>`ListItem.FolderPath`</b>,
5668 /// \anchor ListItem_FolderPath
5669 /// _string_,
5670 /// @return The complete path of the currently selected song or movie in a
5671 /// container (without user details).
5672 /// <p>
5673 /// }
5674 /// \table_row3{ <b>`ListItem.FileNameAndPath`</b>,
5675 /// \anchor ListItem_FileNameAndPath
5676 /// _string_,
5677 /// @return The full path with filename of the currently selected song or
5678 /// movie in a container.
5679 /// <p>
5680 /// }
5681 /// \table_row3{ <b>`ListItem.FileExtension`</b>,
5682 /// \anchor ListItem_FileExtension
5683 /// _string_,
5684 /// @return The file extension (without leading dot) of the currently selected
5685 /// item in a container.
5686 /// <p>
5687 /// }
5688 /// \table_row3{ <b>`ListItem.FileNameNoExtension`</b>,
5689 /// \anchor ListItem_FileName_No_Extension
5690 /// _string_,
5691 /// @return The filename without extension of the currently selected
5692 /// item in a container.
5693 /// <p><hr>
5694 /// @skinning_v19 **[New Infolabel]** \link ListItem_FileName_No_Extension `ListItem.FileNameNoExtension`\endlink
5695 /// <p>
5696 /// }
5697 /// \table_row3{ <b>`ListItem.Date`</b>,
5698 /// \anchor ListItem_Date
5699 /// _string_,
5700 /// @return The file date of the currently selected song or movie in a
5701 /// container / Aired date of an episode / Day\, start time and end time of
5702 /// current selected TV programme (PVR).
5703 /// <p>
5704 /// }
5705 /// \table_row3{ <b>`ListItem.DateTime`</b>,
5706 /// \anchor ListItem_DateTime
5707 /// _string_,
5708 /// @return The date and time a certain event happened (event log).
5709 /// <p><hr>
5710 /// @skinning_v16 **[New Infolabel]** \link ListItem_DateTime `ListItem.DateTime`\endlink
5711 /// <p>
5712 /// }
5713 /// \table_row3{ <b>`ListItem.DateAdded`</b>,
5714 /// \anchor ListItem_DateAdded
5715 /// _string_,
5716 /// @return The date the currently selected item was added to the
5717 /// library / Date and time of an event in the EventLog window.
5718 /// <p>
5719 /// }
5720 /// \table_row3{ <b>`ListItem.Size`</b>,
5721 /// \anchor ListItem_Size
5722 /// _string_,
5723 /// @return The file size of the currently selected song or movie in a
5724 /// container.
5725 /// <p>
5726 /// }
5727 /// \table_row3{ <b>`ListItem.Rating([name])`</b>,
5728 /// \anchor ListItem_Rating
5729 /// _string_,
5730 /// @return The scraped rating of the currently selected item in a container (1-10).
5731 /// @param name - [opt] you can specify the name of the scraper to retrieve a specific rating\,
5732 /// for use in dialogvideoinfo.xml.
5733 /// <p><hr>
5734 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Rating `ListItem.Rating([name])`\endlink replaces
5735 /// the old `ListItem.Ratings([name])` infolabel.
5736 /// @skinning_v17 **[New Infolabel]** \link ListItem_Rating `ListItem.Ratings([name])`\endlink
5737 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_Rating `ListItem.Ratings`\endlink
5738 /// for songs it's now the scraped rating.
5739 /// <p>
5740 /// }
5741 /// \table_row3{ <b>`ListItem.Set`</b>,
5742 /// \anchor ListItem_Set
5743 /// _string_,
5744 /// @return The name of the set the movie is part of.
5745 /// <p><hr>
5746 /// @skinning_v17 **[New Infolabel]** \link ListItem_Set `ListItem.Set`\endlink
5747 /// <p>
5748 /// }
5749 /// \table_row3{ <b>`ListItem.SetId`</b>,
5750 /// \anchor ListItem_SetId
5751 /// _string_,
5752 /// @return The id of the set the movie is part of.
5753 /// <p><hr>
5754 /// @skinning_v17 **[New Infolabel]** \link ListItem_SetId `ListItem.SetId`\endlink
5755 /// <p>
5756 /// }
5757 /// \table_row3{ <b>`ListItem.Status`</b>,
5758 /// \anchor ListItem_Status
5759 /// _string_,
5760 /// @return One of the following status:
5761 /// - <b>"returning series"</b>
5762 /// - <b>"in production"</b>
5763 /// - <b>"planned"</b>
5764 /// - <b>"cancelled"</b>
5765 /// - <b>"ended"</b>
5766 /// <p>
5767 /// @note For use with tv shows.
5768 /// <p><hr>
5769 /// @skinning_v17 **[New Infolabel]** \link ListItem_Status `ListItem.Status`\endlink
5770 /// <p>
5771 /// }
5772 /// \table_row3{ <b>`ListItem.EndTimeResume`</b>,
5773 /// \anchor ListItem_EndTimeResume
5774 /// _string_,
5775 /// @return Returns the time a video will end if you resume it\, instead of playing it from the beginning.
5776 /// <p><hr>
5777 /// @skinning_v17 **[New Infolabel]** \link ListItem_EndTimeResume `ListItem.EndTimeResume`\endlink
5778 /// <p>
5779 /// }
5780 /// \table_row3{ <b>`ListItem.UserRating`</b>,
5781 /// \anchor ListItem_UserRating
5782 /// _string_,
5783 /// @return The user rating of the currently selected item in a container (1-10).
5784 /// <p><hr>
5785 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_UserRating `ListItem.UserRating`\endlink
5786 /// now available for albums/songs.
5787 /// @skinning_v16 **[New Infolabel]** \link ListItem_UserRating `ListItem.UserRating`\endlink
5788 /// <p>
5789 /// }
5790 /// \table_row3{ <b>`ListItem.Votes([name])`</b>,
5791 /// \anchor ListItem_Votes
5792 /// _string_,
5793 /// @return The scraped votes of the currently selected movie in a container.
5794 /// @param name - [opt] you can specify the name of the scraper to retrieve specific votes\,
5795 /// for use in `dialogvideoinfo.xml`.
5796 /// <p><hr>
5797 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_Votes `ListItem.Votes([name])`\endlink
5798 /// add optional param <b>name</b> to specify the scrapper.
5799 /// @skinning_v13 **[New Infolabel]** \link ListItem_Votes `ListItem.Votes`\endlink
5800 /// <p>
5801 /// }
5802 /// \table_row3{ <b>`ListItem.RatingAndVotes([name])`</b>,
5803 /// \anchor ListItem_RatingAndVotes
5804 /// _string_,
5805 /// @return The scraped rating and votes of the currently selected movie in a
5806 /// container (1-10).
5807 /// @param name - [opt] you can specify the name of the scraper to retrieve specific votes\,
5808 /// for use in `dialogvideoinfo.xml`.
5809 /// <p><hr>
5810 /// @skinning_v17 **[New Infolabel]** \link ListItem_RatingAndVotes `ListItem.RatingAndVotes([name])`\endlink
5811 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_RatingAndVotes `ListItem.RatingAndVotes`\endlink
5812 /// now available for albums/songs.
5813 /// <p>
5814 /// }
5815 /// \table_row3{ <b>`ListItem.Mood`</b>,
5816 /// \anchor ListItem_Mood
5817 /// _string_,
5818 /// @return The mood of the selected song.
5819 /// <p><hr>
5820 /// @skinning_v17 **[New Infolabel]** \link ListItem_Mood `ListItem.Mood`\endlink
5821 /// <p>
5822 /// }
5823 /// \table_row3{ <b>`ListItem.Mpaa`</b>,
5824 /// \anchor ListItem_Mpaa
5825 /// _string_,
5826 /// @return The MPAA rating of the currently selected movie in a container.
5827 /// <p>
5828 /// }
5829 /// \table_row3{ <b>`ListItem.ProgramCount`</b>,
5830 /// \anchor ListItem_ProgramCount
5831 /// _string_,
5832 /// @return The number of times an xbe has been run from "my programs".
5833 /// @todo description might be outdated
5834 /// <p>
5835 /// }
5836 /// \table_row3{ <b>`ListItem.Duration`</b>,
5837 /// \anchor ListItem_Duration
5838 /// _string_,
5839 /// @return The duration of the currently selected item in a container
5840 /// in the format <b>hh:mm:ss</b>.
5841 /// @note <b>hh:</b> will be omitted if hours value is zero.
5842 /// <p><hr>
5843 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Duration `ListItem.Duration`\endlink will
5844 /// return <b>hh:mm:ss</b> instead of the duration in minutes.
5845 /// <p>
5846 /// }
5847 /// \table_row3{ <b>`ListItem.Duration(format)`</b>,
5848 /// \anchor ListItem_Duration_format
5849 /// _string_,
5850 /// @return The duration of the currently selected item in a container in
5851 /// different formats.
5852 /// @param format [opt] The format of the return time value.
5853 /// See \ref TIME_FORMAT for the list of possible values.
5854 /// <p>
5855 /// }
5856 /// \table_row3{ <b>`ListItem.DBTYPE`</b>,
5857 /// \anchor ListItem_DBTYPE
5858 /// _string_,
5859 /// @return The database type of the \ref ListItem_DBID "ListItem.DBID" for videos (movie\, set\,
5860 /// genre\, actor\, tvshow\, season\, episode). It does not return any value
5861 /// for the music library.
5862 /// @note Beware with season\, the "*all seasons" entry does
5863 /// give a DBTYPE "season" and a DBID\, but you can't get the details of that
5864 /// entry since it's a virtual entry in the Video Library.
5865 /// <p><hr>
5866 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_DBTYPE `ListItem.DBTYPE`\endlink
5867 /// now available in the music library.
5868 /// <p>
5869 /// }
5870 /// \table_row3{ <b>`ListItem.DBID`</b>,
5871 /// \anchor ListItem_DBID
5872 /// _string_,
5873 /// @return The database id of the currently selected listitem in a container.
5874 /// <p>
5875 /// }
5876 /// \table_row3{ <b>`ListItem.Appearances`</b>,
5877 /// \anchor ListItem_Appearances
5878 /// _string_,
5879 /// @return The number of movies featuring the selected actor / directed by the selected director.
5880 /// <p><hr>
5881 /// @skinning_v17 **[New Infolabel]** \link ListItem_Appearances `ListItem.Appearances`\endlink
5882 /// <p>
5883 /// }
5884 /// \table_row3{ <b>`ListItem.Cast`</b>,
5885 /// \anchor ListItem_Cast
5886 /// _string_,
5887 /// @return A list of cast members\, separated by carriage returns.
5888 /// <p><hr>
5889 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Cast `ListItem.Cast`\endlink
5890 /// also supports EPG.
5891 /// <p>
5892 /// }
5893 /// \table_row3{ <b>`ListItem.CastAndRole`</b>,
5894 /// \anchor ListItem_CastAndRole
5895 /// _string_,
5896 /// @return A list of cast members and roles\, separated by carriage
5897 /// returns. Every cast/role combination is formatted 'cast' as 'role' where 'as' is localised.
5898 /// <p>
5899 /// }
5900 /// \table_row3{ <b>`ListItem.Studio`</b>,
5901 /// \anchor ListItem_Studio
5902 /// _string_,
5903 /// @return The studio of current selected Music Video in a container.
5904 /// <p>
5905 /// }
5906 /// \table_row3{ <b>`ListItem.Top250`</b>,
5907 /// \anchor ListItem_Top250
5908 /// _string_,
5909 /// @return The IMDb top250 position of the currently selected listitem in a
5910 /// container.
5911 /// <p>
5912 /// }
5913 /// \table_row3{ <b>`ListItem.Trailer`</b>,
5914 /// \anchor ListItem_Trailer
5915 /// _string_,
5916 /// @return The full trailer path with filename of the currently selected
5917 /// movie in a container.
5918 /// <p>
5919 /// }
5920 /// \table_row3{ <b>`ListItem.Writer`</b>,
5921 /// \anchor ListItem_Writer
5922 /// _string_,
5923 /// @return The name of Writer of current Video in a container.
5924 /// <p><hr>
5925 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Writer `ListItem.Writer`\endlink
5926 /// also supports EPG.
5927 /// <p>
5928 /// }
5929 /// \table_row3{ <b>`ListItem.Tag`</b>,
5930 /// \anchor ListItem_Tag
5931 /// _string_,
5932 /// @return The summary of current Video in a container.
5933 /// <p><hr>
5934 /// @skinning_v17 **[New Infolabel]** \link ListItem_Tag `ListItem.Tag`\endlink
5935 /// <p>
5936 /// }
5937 /// \table_row3{ <b>`ListItem.Tagline`</b>,
5938 /// \anchor ListItem_Tagline
5939 /// _string_,
5940 /// @return A Small Summary of current Video in a container.
5941 /// <p>
5942 /// }
5943 /// \table_row3{ <b>`ListItem.PlotOutline`</b>,
5944 /// \anchor ListItem_PlotOutline
5945 /// _string_,
5946 /// @return A small Summary of current Video in a container.
5947 /// <p>
5948 /// }
5949 /// \table_row3{ <b>`ListItem.Plot`</b>,
5950 /// \anchor ListItem_Plot
5951 /// _string_,
5952 /// @return The complete Text Summary of Video in a container.
5953 /// <p>
5954 /// }
5955 /// \table_row3{ <b>`ListItem.IMDBNumber`</b>,
5956 /// \anchor ListItem_IMDBNumber
5957 /// _string_,
5958 /// @return The IMDb ID of the selected Video in a container.
5959 /// <p><hr>
5960 /// @skinning_v15 **[New Infolabel]** \link ListItem_IMDBNumber `ListItem.IMDBNumber`\endlink
5961 /// <p>
5962 /// }
5963 /// \table_row3{ <b>`ListItem.EpisodeName`</b>,
5964 /// \anchor ListItem_EpisodeName
5965 /// _string_,
5966 /// @return The name of the episode if the selected EPG item is a TV Show (PVR).
5967 /// <p><hr>
5968 /// @skinning_v15 **[New Infolabel]** \link ListItem_EpisodeName `ListItem.EpisodeName`\endlink
5969 /// <p>
5970 /// }
5971 /// \table_row3{ <b>`ListItem.PercentPlayed`</b>,
5972 /// \anchor ListItem_PercentPlayed
5973 /// _string_,
5974 /// @return The percentage value [0-100] of how far the selected video has been
5975 /// played.
5976 /// <p>
5977 /// }
5978 /// \table_row3{ <b>`ListItem.LastPlayed`</b>,
5979 /// \anchor ListItem_LastPlayed
5980 /// _string_,
5981 /// @return The last play date of Video in a container.
5982 /// <p>
5983 /// }
5984 /// \table_row3{ <b>`ListItem.PlayCount`</b>,
5985 /// \anchor ListItem_PlayCount
5986 /// _string_,
5987 /// @return The playcount of Video in a container.
5988 /// <p>
5989 /// }
5990 /// \table_row3{ <b>`ListItem.ChannelName`</b>,
5991 /// \anchor ListItem_ChannelName
5992 /// _string_,
5993 /// @return The name of current selected TV channel in a container.
5994 /// <p>
5995 /// }
5996 /// \table_row3{ <b>`ListItem.ChannelLogo`</b>,
5997 /// \anchor ListItem_ChannelLogo
5998 /// _string_,
5999 /// @return The path for the logo of the currently selected radio or TV channel\, if available (PVR).
6000 /// <p><hr>
6001 /// @skinning_v22 **[New Infolabel]** \link ListItem_ChannelLogo `ListItem.ChannelLogo`\endlink
6002 /// <p>
6003 /// }
6004 /// \table_row3{ <b>`ListItem.VideoCodec`</b>,
6005 /// \anchor ListItem_VideoCodec
6006 /// _string_,
6007 /// @return The video codec of the currently selected video. Common values:
6008 /// - <b>3iv2</b>
6009 /// - <b>av1</b>
6010 /// - <b>avc1</b>
6011 /// - <b>div2</b>
6012 /// - <b>div3</b>
6013 /// - <b>divx</b>
6014 /// - <b>divx 4</b>
6015 /// - <b>dx50</b>
6016 /// - <b>flv</b>
6017 /// - <b>h264</b>
6018 /// - <b>microsoft</b>
6019 /// - <b>mp42</b>
6020 /// - <b>mp43</b>
6021 /// - <b>mp4v</b>
6022 /// - <b>mpeg1video</b>
6023 /// - <b>mpeg2video</b>
6024 /// - <b>mpg4</b>
6025 /// - <b>rv40</b>
6026 /// - <b>svq1</b>
6027 /// - <b>svq3</b>
6028 /// - <b>theora</b>
6029 /// - <b>vp6f</b>
6030 /// - <b>wmv2</b>
6031 /// - <b>wmv3</b>
6032 /// - <b>wvc1</b>
6033 /// - <b>xvid</b>
6034 /// - etc
6035 /// <p>
6036 /// }
6037 /// \table_row3{ <b>`ListItem.VideoResolution`</b>,
6038 /// \anchor ListItem_VideoResolution
6039 /// _string_,
6040 /// @return The resolution of the currently selected video. Possible values:
6041 /// - <b>480</b>
6042 /// - <b>576</b>
6043 /// - <b>540</b>
6044 /// - <b>720</b>
6045 /// - <b>1080</b>
6046 /// - <b>4K</b>
6047 /// - <b>8K</b>
6048 /// @note 540 usually means a widescreen
6049 /// format (around 960x540) while 576 means PAL resolutions (normally
6050 /// 720x576)\, therefore 540 is actually better resolution than 576.
6051 /// <p><hr>
6052 /// @skinning_v18 **[Updated Infolabel]** \link ListItem_VideoResolution ListItem.VideoResolution\endlink
6053 /// added <b>8K</b> as a possible value.
6054 /// <p>
6055 /// }
6056 /// \table_row3{ <b>`ListItem.VideoAspect`</b>,
6057 /// \anchor ListItem_VideoAspect
6058 /// _string_,
6059 /// @return The aspect ratio of the currently selected video. Possible values:
6060 /// - <b>1.00</b>
6061 /// - <b>1.19</b>
6062 /// - <b>1.33</b>
6063 /// - <b>1.37</b>
6064 /// - <b>1.66</b>
6065 /// - <b>1.78</b>
6066 /// - <b>1.85</b>
6067 /// - <b>2.00</b>
6068 /// - <b>2.20</b>
6069 /// - <b>2.35</b>
6070 /// - <b>2.40</b>
6071 /// - <b>2.55</b>
6072 /// - <b>2.76</b>
6073 /// <p>
6074 /// }
6075 /// \table_row3{ <b>`ListItem.AudioCodec`</b>,
6076 /// \anchor ListItem_AudioCodec
6077 /// _string_,
6078 /// @return The audio codec of the currently selected video. Common values:
6079 /// - <b>aac</b>
6080 /// - <b>ac3</b>
6081 /// - <b>cook</b>
6082 /// - <b>dca</b>
6083 /// - <b>dtshd_hra</b>
6084 /// - <b>dtshd_ma</b>
6085 /// - <b>eac3</b>
6086 /// - <b>mp1</b>
6087 /// - <b>mp2</b>
6088 /// - <b>mp3</b>
6089 /// - <b>pcm_s16be</b>
6090 /// - <b>pcm_s16le</b>
6091 /// - <b>pcm_u8</b>
6092 /// - <b>truehd</b>
6093 /// - <b>vorbis</b>
6094 /// - <b>wmapro</b>
6095 /// - <b>wmav2</b>
6096 /// <p>
6097 /// }
6098 /// \table_row3{ <b>`ListItem.AudioChannels`</b>,
6099 /// \anchor ListItem_AudioChannels
6100 /// _string_,
6101 /// @return The number of audio channels of the currently selected video. Possible values:
6102 /// - <b>1</b>
6103 /// - <b>2</b>
6104 /// - <b>4</b>
6105 /// - <b>5</b>
6106 /// - <b>6</b>
6107 /// - <b>8</b>
6108 /// - <b>10</b>
6109 /// <p><hr>
6110 /// @skinning_v16 **[Infolabel Updated]** \link ListItem_AudioChannels `ListItem.AudioChannels`\endlink
6111 /// if a video contains no audio\, these infolabels will now return empty.
6112 /// (they used to return 0)
6113 /// <p>
6114 /// }
6115 /// \table_row3{ <b>`ListItem.AudioLanguage`</b>,
6116 /// \anchor ListItem_AudioLanguage
6117 /// _string_,
6118 /// @return The audio language of the currently selected video (an
6119 /// ISO 639-2 three character code: e.g. eng\, epo\, deu)
6120 /// <p>
6121 /// }
6122 /// \table_row3{ <b>`ListItem.SubtitleLanguage`</b>,
6123 /// \anchor ListItem_SubtitleLanguage
6124 /// _string_,
6125 /// @return The subtitle language of the currently selected video (an
6126 /// ISO 639-2 three character code: e.g. eng\, epo\, deu)
6127 /// <p>
6128 /// }
6129 /// \table_row3{ <b>`ListItem.Property(AudioCodec.[n])`</b>,
6130 /// \anchor ListItem_Property_AudioCodec
6131 /// _string_,
6132 /// @return The audio codec of the currently selected video
6133 /// @param n - the number of the audiostream (values: see \ref ListItem_AudioCodec "ListItem.AudioCodec")
6134 /// <p><hr>
6135 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioCodec `ListItem.Property(AudioCodec.[n])`\endlink
6136 /// <p>
6137 /// }
6138 /// \table_row3{ <b>`ListItem.Property(AudioChannels.[n])`</b>,
6139 /// \anchor ListItem_Property_AudioChannels
6140 /// _string_,
6141 /// @return The number of audio channels of the currently selected video
6142 /// @param n - the number of the audiostream (values: see
6143 /// \ref ListItem_AudioChannels "ListItem.AudioChannels")
6144 /// <p><hr>
6145 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioChannels `ListItem.Property(AudioChannels.[n])`\endlink
6146 /// <p>
6147 /// }
6148 /// \table_row3{ <b>`ListItem.Property(AudioLanguage.[n])`</b>,
6149 /// \anchor ListItem_Property_AudioLanguage
6150 /// _string_,
6151 /// @return The audio language of the currently selected video
6152 /// @param n - the number of the audiostream (values: see \ref ListItem_AudioLanguage "ListItem.AudioLanguage")
6153 /// <p><hr>
6154 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioLanguage `ListItem.Property(AudioLanguage.[n])`\endlink
6155 /// <p>
6156 /// }
6157 /// \table_row3{ <b>`ListItem.Property(SubtitleLanguage.[n])`</b>,
6158 /// \anchor ListItem_Property_SubtitleLanguage
6159 /// _string_,
6160 /// @return The subtitle language of the currently selected video
6161 /// @param n - the number of the subtitle (values: see \ref ListItem_SubtitleLanguage "ListItem.SubtitleLanguage")
6162 /// <p><hr>
6163 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_SubtitleLanguage `ListItem.Property(SubtitleLanguage.[n])`\endlink
6164 /// <p>
6165 /// }
6166 /// \table_row3{ <b>`ListItem.Property(Addon.Disclaimer)`</b>,
6167 /// \anchor ListItem_Property_AddonDisclaimer
6168 /// _string_,
6169 /// @return The disclaimer of the currently selected addon.
6170 /// <p>
6171 /// }
6172 /// \table_row3{ <b>`ListItem.Property(Addon.Changelog)`</b>,
6173 /// \anchor ListItem_Property_AddonChangelog
6174 /// _string_,
6175 /// @return The changelog of the currently selected addon.
6176 /// <p>
6177 /// }
6178 /// \table_row3{ <b>`ListItem.Property(Addon.ID)`</b>,
6179 /// \anchor ListItem_Property_AddonID
6180 /// _string_,
6181 /// @return The identifier of the currently selected addon.
6182 /// <p>
6183 /// }
6184 /// \table_row3{ <b>`ListItem.Property(Addon.Status)`</b>,
6185 /// \anchor ListItem_Property_AddonStatus
6186 /// _string_,
6187 /// @return The status of the currently selected addon.
6188 /// @todo missing reference in GuiInfoManager.cpp making it hard to track.
6189 /// <p>
6190 /// }
6191 /// \table_row3{ <b>`ListItem.Property(Addon.Orphaned)`</b>,
6192 /// \anchor ListItem_Property_AddonOrphaned
6193 /// _boolean_,
6194 /// @return **True** if the Addon is orphanad.
6195 /// @todo missing reference in GuiInfoManager.cpp making it hard to track.
6196 /// <p><hr>
6197 /// @skinning_v17 **[New Boolean Condition]** \link ListItem_Property_AddonOrphaned `ListItem.Property(Addon.Orphaned)`\endlink
6198 /// <p>
6199 /// }
6200 /// \table_row3{ <b>`ListItem.Property(Addon.Path)`</b>,
6201 /// \anchor ListItem_Property_AddonPath
6202 /// _string_,
6203 /// @return The path of the currently selected addon.
6204 /// <p>
6205 /// }
6206 /// \table_row3{ <b>`ListItem.StartTime`</b>,
6207 /// \anchor ListItem_StartTime
6208 /// _string_,
6209 /// @return The start time of current selected TV programme in a container.
6210 /// <p>
6211 /// }
6212 /// \table_row3{ <b>`ListItem.EndTime`</b>,
6213 /// \anchor ListItem_EndTime
6214 /// _string_,
6215 /// @return The end time of current selected TV programme in a container.
6216 /// <p>
6217 /// }
6218 /// \table_row3{ <b>`ListItem.StartDate`</b>,
6219 /// \anchor ListItem_StartDate
6220 /// _string_,
6221 /// @return The start date of current selected TV programme in a container.
6222 /// <p>
6223 /// }
6224 /// \table_row3{ <b>`ListItem.EndDate`</b>,
6225 /// \anchor ListItem_EndDate
6226 /// _string_,
6227 /// @return The end date of current selected TV programme in a container.
6228 /// <p>
6229 /// }
6230 /// \table_row3{ <b>`ListItem.NextTitle`</b>,
6231 /// \anchor ListItem_NextTitle
6232 /// _string_,
6233 /// @return The title of the next item (PVR).
6234 /// <p>
6235 /// }
6236 /// \table_row3{ <b>`ListItem.NextGenre`</b>,
6237 /// \anchor ListItem_NextGenre
6238 /// _string_,
6239 /// @return The genre of the next item (PVR).
6240 /// <p>
6241 /// }
6242 /// \table_row3{ <b>`ListItem.NextPlot`</b>,
6243 /// \anchor ListItem_NextPlot
6244 /// _string_,
6245 /// @return The plot of the next item (PVR).
6246 /// <p>
6247 /// }
6248 /// \table_row3{ <b>`ListItem.NextPlotOutline`</b>,
6249 /// \anchor ListItem_NextPlotOutline
6250 /// _string_,
6251 /// @return The plot outline of the next item (PVR).
6252 /// <p>
6253 /// }
6254 /// \table_row3{ <b>`ListItem.NextStartTime`</b>,
6255 /// \anchor ListItem_NextStartTime
6256 /// _string_,
6257 /// @return The start time of the next item (PVR).
6258 /// <p>
6259 /// }
6260 /// \table_row3{ <b>`ListItem.NextEndTime`</b>,
6261 /// \anchor ListItem_NextEndTime
6262 /// _string_,
6263 /// @return The end of the next item (PVR).
6264 /// <p>
6265 /// }
6266 /// \table_row3{ <b>`ListItem.NextStartDate`</b>,
6267 /// \anchor ListItem_NextStartDate
6268 /// _string_,
6269 /// @return The start date of the next item (PVR).
6270 /// <p>
6271 /// }
6272 /// \table_row3{ <b>`ListItem.NextEndDate`</b>,
6273 /// \anchor ListItem_NextEndDate
6274 /// _string_,
6275 /// @return The end date of the next item (PVR).
6276 /// <p>
6277 /// }
6278 /// \table_row3{ <b>`ListItem.NextDuration`</b>,
6279 /// \anchor ListItem_NextDuration
6280 /// _string_,
6281 /// @return The duration of the next item (PVR) in the format <b>hh:mm:ss</b>.
6282 /// @note <b>hh:</b> will be omitted if hours value is zero.
6283 /// <p><hr>
6284 /// @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration `ListItem.NextDuration`\endlink
6285 /// <p>
6286 /// }
6287 /// \table_row3{ <b>`ListItem.NextDuration(format)`</b>,
6288 /// \anchor ListItem_NextDuration_format
6289 /// _string_,
6290 /// @return The duration of the next item (PVR) in different formats.
6291 /// @param format [opt] The format of the return time value.
6292 /// See \ref TIME_FORMAT for the list of possible values.
6293 /// <p><hr>
6294 /// @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration_format `ListItem.NextDuration(format)`\endlink
6295 /// <p>
6296 /// }
6297 /// \table_row3{ <b>`ListItem.ChannelGroup`</b>,
6298 /// \anchor ListItem_ChannelGroup
6299 /// _string_,
6300 /// @return The channel group of the selected item (PVR).
6301 /// <p>
6302 /// }
6303 /// \table_row3{ <b>`ListItem.ChannelNumberLabel`</b>,
6304 /// \anchor ListItem_ChannelNumberLabel
6305 /// _string_,
6306 /// @return The channel and subchannel number of the currently selected channel that's
6307 /// currently playing (PVR).
6308 /// <p><hr>
6309 /// @skinning_v14 **[New Infolabel]** \link ListItem_ChannelNumberLabel `ListItem.ChannelNumberLabel`\endlink
6310 /// <p>
6311 /// }
6312 /// \table_row3{ <b>`ListItem.Progress`</b>,
6313 /// \anchor ListItem_Progress
6314 /// _string_,
6315 /// @return The part of the programme that's been played (PVR).
6316 /// <p>
6317 /// }
6318 /// \table_row3{ <b>`ListItem.StereoscopicMode`</b>,
6319 /// \anchor ListItem_StereoscopicMode
6320 /// _string_,
6321 /// @return The stereomode of the selected video:
6322 /// - <b>mono</b>
6323 /// - <b>split_vertical</b>
6324 /// - <b>split_horizontal</b>
6325 /// - <b>row_interleaved</b>
6326 /// - <b>anaglyph_cyan_red</b>
6327 /// - <b>anaglyph_green_magenta</b>
6328 /// <p><hr>
6329 /// @skinning_v13 **[New Infolabel]** \link ListItem_StereoscopicMode `ListItem.StereoscopicMode`\endlink
6330 /// <p>
6331 /// }
6332 /// \table_row3{ <b>`ListItem.HasTimerSchedule`</b>,
6333 /// \anchor ListItem_HasTimerSchedule
6334 /// _boolean_,
6335 /// @return **True** if the item was scheduled by a timer rule (PVR).
6336 /// <p><hr>
6337 /// @skinning_v16 **[New Boolean Condition]** \ref ListItem_HasTimerSchedule "ListItem.HasTimerSchedule"
6338 /// <p>
6339 /// }
6340 /// \table_row3{ <b>`ListItem.HasReminder`</b>,
6341 /// \anchor ListItem_HasReminder
6342 /// _boolean_,
6343 /// @return **True** if the item has a reminder set (PVR).
6344 /// <p><hr>
6345 /// @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminder "ListItem.HasReminder"
6346 /// <p>
6347 /// }
6348 /// \table_row3{ <b>`ListItem.HasReminderRule`</b>,
6349 /// \anchor ListItem_ListItem.HasReminderRule
6350 /// _boolean_,
6351 /// @return **True** if the item was scheduled by a reminder timer rule (PVR).
6352 /// <p><hr>
6353 /// @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminderRule "ListItem.HasReminderRule"
6354 /// <p>
6355 /// }
6356 /// \table_row3{ <b>`ListItem.HasRecording`</b>,
6357 /// \anchor ListItem_HasRecording
6358 /// _boolean_,
6359 /// @return **True** if a given epg tag item currently gets recorded or has been recorded.
6360 /// <p>
6361 /// }
6362 /// \table_row3{ <b>`ListItem.TimerHasError`</b>,
6363 /// \anchor ListItem_TimerHasError
6364 /// _boolean_,
6365 /// @return **True** if the item has a timer and it won't be recorded because of an error (PVR).
6366 /// <p><hr>
6367 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasError "ListItem.TimerHasError"
6368 /// <p>
6369 /// }
6370 /// \table_row3{ <b>`ListItem.TimerHasConflict`</b>,
6371 /// \anchor ListItem_TimerHasConflict
6372 /// _boolean_,
6373 /// @return **True** if the item has a timer and it won't be recorded because of a conflict (PVR).
6374 /// <p><hr>
6375 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasConflict "ListItem.TimerHasConflict"
6376 /// <p>
6377 /// }
6378 /// \table_row3{ <b>`ListItem.TimerIsActive`</b>,
6379 /// \anchor ListItem_TimerIsActive
6380 /// _boolean_,
6381 /// @return **True** if the item has a timer that will be recorded\, i.e. the timer is enabled (PVR).
6382 /// <p><hr>
6383 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerIsActive "ListItem.TimerIsActive"
6384 /// <p>
6385 /// }
6386 /// \table_row3{ <b>`ListItem.Comment`</b>,
6387 /// \anchor ListItem_Comment
6388 /// _string_,
6389 /// @return The comment assigned to the item (PVR/MUSIC).
6390 /// <p>
6391 /// }
6392 /// \table_row3{ <b>`ListItem.TimerType`</b>,
6393 /// \anchor ListItem_TimerType
6394 /// _string_,
6395 /// @return The type of the PVR timer / timer rule item as a human readable string.
6396 /// <p>
6397 /// }
6398 /// \table_row3{ <b>`ListItem.EpgEventTitle`</b>,
6399 /// \anchor ListItem_EpgEventTitle
6400 /// _string_,
6401 /// @return The title of the epg event associated with the item\, if any.
6402 /// <p>
6403 /// }
6404 /// \table_row3{ <b>`ListItem.EpgEventIcon`</b>,
6405 /// \anchor ListItem_EpgEventIcon
6406 /// _string_,
6407 /// @return The thumbnail for the EPG event associated with the item (if it exists).
6408 /// <p><hr>
6409 /// @skinning_v18 **[New Infolabel]** \link ListItem_EpgEventIcon `ListItem.EpgEventIcon`\endlink
6410 /// <p>
6411 /// }
6412 /// \table_row3{ <b>`ListItem.InProgress`</b>,
6413 /// \anchor ListItem_InProgress
6414 /// _boolean_,
6415 /// @return **True** if the EPG event item is currently active (time-wise).
6416 /// <p>
6417 /// }
6418 /// \table_row3{ <b>`ListItem.IsParentFolder`</b>,
6419 /// \anchor ListItem_IsParentFolder
6420 /// _boolean_,
6421 /// @return **True** if the current list item is the goto parent folder '..'.
6422 /// <p><hr>
6423 /// @skinning_v17 **[New Boolean Condition]** \link ListItem_IsParentFolder `ListItem.IsParentFolder`\endlink
6424 /// <p>
6425 /// }
6426 /// \table_row3{ <b>`ListItem.AddonName`</b>,
6427 /// \anchor ListItem_AddonName
6428 /// _string_,
6429 /// @return The name of the currently selected addon.
6430 /// <p><hr>
6431 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonName `ListItem.AddonName`\endlink
6432 /// replaces `ListItem.Property(Addon.Name)`.
6433 /// <p>
6434 /// }
6435 /// \table_row3{ <b>`ListItem.AddonVersion`</b>,
6436 /// \anchor ListItem_AddonVersion
6437 /// _string_,
6438 /// @return The version of the currently selected addon.
6439 /// <p><hr>
6440 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonVersion `ListItem.AddonVersion`\endlink
6441 /// replaces `ListItem.Property(Addon.Version)`.
6442 /// <p>
6443 /// }
6444 /// \table_row3{ <b>`ListItem.AddonCreator`</b>,
6445 /// \anchor ListItem_AddonCreator
6446 /// _string_,
6447 /// @return The name of the author the currently selected addon.
6448 /// <p><hr>
6449 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonCreator `ListItem.AddonCreator`\endlink
6450 /// replaces `ListItem.Property(Addon.Creator)`.
6451 /// <p>
6452 /// }
6453 /// \table_row3{ <b>`ListItem.AddonSummary`</b>,
6454 /// \anchor ListItem_AddonSummary
6455 /// _string_,
6456 /// @return A short description of the currently selected addon.
6457 /// <p><hr>
6458 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonSummary `ListItem.AddonSummary`\endlink
6459 /// replaces `ListItem.Property(Addon.Summary)`.
6460 /// <p>
6461 /// }
6462 /// \table_row3{ <b>`ListItem.AddonDescription`</b>,
6463 /// \anchor ListItem_AddonDescription
6464 /// _string_,
6465 /// @return The full description of the currently selected addon.
6466 /// <p><hr>
6467 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDescription `ListItem.AddonDescription`\endlink
6468 /// replaces `ListItem.Property(Addon.Description)`.
6469 /// <p>
6470 /// }
6471 /// \table_row3{ <b>`ListItem.AddonDisclaimer`</b>,
6472 /// \anchor ListItem_AddonDisclaimer
6473 /// _string_,
6474 /// @return The disclaimer of the currently selected addon.
6475 /// <p><hr>
6476 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDisclaimer `ListItem.AddonDisclaimer`\endlink
6477 /// replaces `ListItem.Property(Addon.Disclaimer)`.
6478 /// <p>
6479 /// }
6480 /// \table_row3{ <b>`ListItem.AddonBroken`</b>,
6481 /// \anchor ListItem_AddonBroken
6482 /// _string_,
6483 /// @return A message when the addon is marked as broken in the repo.
6484 /// @deprecated but still available\, use \ref ListItem_AddonLifecycleDesc "ListItem.AddonLifecycleDesc"
6485 /// instead
6486 /// <p><hr>
6487 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonBroken `ListItem.AddonBroken`\endlink
6488 /// replaces `ListItem.Property(Addon.Broken)`.
6489 /// <p>
6490 /// }
6491 /// \table_row3{ <b>`ListItem.AddonLifecycleType`</b>,
6492 /// \anchor ListItem_AddonLifecycleType
6493 /// _string_,
6494 /// @return String name when the addon is marked as special condition in the repo.
6495 /// - <b>Label: 24169 (Normal)</b> - Used if an add-on has no special lifecycle state which is the default state
6496 /// - <b>Label: 24170 (Deprecated)</b> - The add-on should be marked as deprecated but is still usable
6497 /// - <b>Label: 24171 (Broken)</b> - The add-on should marked as broken in the repository
6498 /// <p><hr>
6499 /// @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleType `ListItem.AddonLifecycleType`\endlink
6500 /// replaces `ListItem.AddonBroken`.
6501 /// <p>
6502 /// }
6503 /// \table_row3{ <b>`ListItem.AddonLifecycleDesc`</b>,
6504 /// \anchor ListItem_AddonLifecycleDesc
6505 /// _string_,
6506 /// @return From addon defined message text when it is marked as special condition inside repository.
6507 /// <p><hr>
6508 /// @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleDesc `ListItem.AddonLifecycleDesc`\endlink
6509 /// replaces `ListItem.AddonBroken`.
6510 /// <p>
6511 /// }
6512 /// \table_row3{ <b>`ListItem.AddonType`</b>,
6513 /// \anchor ListItem_AddonType
6514 /// _string_,
6515 /// @return The type (screensaver\, script\, skin\, etc...) of the currently selected addon.
6516 /// <p><hr>
6517 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonType `ListItem.AddonType`\endlink
6518 /// replaces `ListItem.Property(Addon.Type)`.
6519 /// <p>
6520 /// }
6521 /// \table_row3{ <b>`ListItem.AddonInstallDate`</b>,
6522 /// \anchor ListItem_AddonInstallDate
6523 /// _string_,
6524 /// @return The date the addon was installed.
6525 /// <p><hr>
6526 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonInstallDate `ListItem.AddonInstallDate`\endlink
6527 /// <p>
6528 /// }
6529 /// \table_row3{ <b>`ListItem.AddonLastUpdated`</b>,
6530 /// \anchor ListItem_AddonLastUpdated
6531 /// _string_,
6532 /// @return The date the addon was last updated.
6533 /// <p><hr>
6534 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUpdated `ListItem.AddonLastUpdated`\endlink
6535 /// <p>
6536 /// }
6537 /// \table_row3{ <b>`ListItem.AddonLastUsed`</b>,
6538 /// \anchor ListItem_AddonLastUsed
6539 /// _string_,
6540 /// @return The date the addon was used last.
6541 /// <p><hr>
6542 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUsed `ListItem.AddonLastUsed`\endlink
6543 /// <p>
6544 /// }
6545 /// \table_row3{ <b>`ListItem.AddonNews`</b>,
6546 /// \anchor ListItem_AddonNews
6547 /// _string_,
6548 /// @return A brief changelog\, taken from the addons' `addon.xml` file.
6549 /// <p><hr>
6550 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonNews `ListItem.AddonNews`\endlink
6551 /// <p>
6552 /// }
6553 /// \table_row3{ <b>`ListItem.AddonSize`</b>,
6554 /// \anchor ListItem_AddonSize
6555 /// _string_,
6556 /// @return The filesize of the addon.
6557 /// <p><hr>
6558 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonSize `ListItem.AddonSize`\endlink
6559 /// <p>
6560 /// }
6561 /// \table_row3{ <b>`ListItem.AddonOrigin`</b>,
6562 /// \anchor ListItem_AddonOrigin
6563 /// _string_,
6564 /// @return The name of the repository the add-on originates from.
6565 /// <p>
6566 /// }
6567 /// \table_row3{ <b>`ListItem.ExpirationDate`</b>,
6568 /// \anchor ListItem_ExpirationDate
6569 /// _string_,
6570 /// @return The expiration date of the selected item in a container\, empty string if not supported.
6571 /// <p>
6572 /// }
6573 /// \table_row3{ <b>`ListItem.ExpirationTime`</b>,
6574 /// \anchor ListItem_ExpirationTime
6575 /// _string_,
6576 /// @return The expiration time of the selected item in a container\, empty string if not supported
6577 /// <p>
6578 /// }
6579 /// \table_row3{ <b>`ListItem.Art(type)`</b>,
6580 /// \anchor ListItem_Art_Type
6581 /// _string_,
6582 /// @return A particular art type for an item.
6583 /// @param type - the art type. It can be any value (set by scripts and scrappers). Common values:
6584 /// - <b>clearart</b> - the clearart (if it exists) of the currently selected movie or tv show.
6585 /// - <b>clearlogo</b> - the clearlogo (if it exists) of the currently selected movie or tv show.
6586 /// - <b>landscape</b> - the 16:9 landscape (if it exists) of the currently selected item.
6587 /// - <b>thumb</b> - the thumbnail of the currently selected item.
6588 /// - <b>poster</b> - the poster of the currently selected movie or tv show.
6589 /// - <b>banner</b> - the banner of the currently selected tv show.
6590 /// - <b>fanart</b> - the fanart image of the currently selected item.
6591 /// - <b>set.fanart</b> - the fanart image of the currently selected movieset.
6592 /// - <b>tvshow.poster</b> - the tv show poster of the parent container.
6593 /// - <b>tvshow.banner</b> - the tv show banner of the parent container.
6594 /// - <b>tvshow.clearlogo</b> - the tv show clearlogo (if it exists) of the parent container.
6595 /// - <b>tvshow.landscape</b> - the tv show landscape (if it exists) of the parent container.
6596 /// - <b>tvshow.clearart</b> - the tv show clearart (if it exists) of the parent container.
6597 /// - <b>season.poster</b> - the season poster of the currently selected season. (Only available in DialogVideoInfo.xml).
6598 /// - <b>season.banner</b> - the season banner of the currently selected season. (Only available in DialogVideoInfo.xml).
6599 /// - <b>season.fanart</b> - the fanart image of the currently selected season. (Only available in DialogVideoInfo.xml)
6600 /// - <b>artist.thumb</b> - the artist thumb of an album or song item.
6601 /// - <b>artist.fanart</b> - the artist fanart of an album or song item.
6602 /// - <b>album.thumb</b> - the album thumb (cover) of a song item.
6603 /// - <b>artist[n].*</b> - in case a song has multiple artists\, a digit is added to the art type for the 2nd artist onwards
6604 /// e.g `Listitem.Art(artist1.thumb)` gives the thumb of the 2nd artist of a song.
6605 /// - <b>albumartist[n].*</b> - n case a song has multiple album artists\, a digit is added to the art type for the 2nd artist
6606 /// onwards e.g `Listitem.Art(artist1.thumb)` gives the thumb of the 2nd artist of a song.
6607 /// <p>
6608 /// @todo Find a better way of finding the art types instead of manually defining them here.
6609 /// <p><hr>
6610 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Art_Type `ListItem.Art(type)`\endlink add <b>artist[n].*</b> and
6611 /// <b>albumartist[n].*</b> as possible targets for <b>type</b>
6612 /// <p>
6613 /// }
6614 /// \table_row3{ <b>`ListItem.Platform`</b>,
6615 /// \anchor ListItem_Platform
6616 /// _string_,
6617 /// @return The game platform (e.g. "Atari 2600") (RETROPLAYER).
6618 /// <p><hr>
6619 /// @skinning_v18 **[New Infolabel]** \link ListItem_Platform `ListItem.Platform`\endlink
6620 /// <p>
6621 /// }
6622 /// \table_row3{ <b>`ListItem.Genres`</b>,
6623 /// \anchor ListItem_Genres
6624 /// _string_,
6625 /// @return The game genres (e.g. "["Action"\,"Strategy"]") (RETROPLAYER).
6626 /// <p><hr>
6627 /// @skinning_v18 **[New Infolabel]** \link ListItem_Genres `ListItem.Genres`\endlink
6628 /// <p>
6629 /// }
6630 /// \table_row3{ <b>`ListItem.Publisher`</b>,
6631 /// \anchor ListItem_Publisher
6632 /// _string_,
6633 /// @return The game publisher (e.g. "Nintendo") (RETROPLAYER).
6634 /// <p><hr>
6635 /// @skinning_v18 **[New Infolabel]** \link ListItem_Publisher `ListItem.Publisher`\endlink
6636 /// <p>
6637 /// }
6638 /// \table_row3{ <b>`ListItem.Developer`</b>,
6639 /// \anchor ListItem_Developer
6640 /// _string_,
6641 /// @return The game developer (e.g. "Square") (RETROPLAYER).
6642 /// <p><hr>
6643 /// @skinning_v18 **[New Infolabel]** \link ListItem_Developer `ListItem.Developer`\endlink
6644 /// <p>
6645 /// }
6646 /// \table_row3{ <b>`ListItem.Overview`</b>,
6647 /// \anchor ListItem_Overview
6648 /// _string_,
6649 /// @return The game overview/summary (RETROPLAYER).
6650 /// <p><hr>
6651 /// @skinning_v18 **[New Infolabel]** \link ListItem_Overview `ListItem.Overview`\endlink
6652 /// <p>
6653 /// }
6654 /// \table_row3{ <b>`ListItem.GameClient`</b>,
6655 /// \anchor ListItem_GameClient
6656 /// _string_,
6657 /// @return The add-on ID of the game client (a.k.a. emulator) to use for playing the game
6658 /// (e.g. game.libretro.fceumm) (RETROPLAYER).
6659 /// <p><hr>
6660 /// @skinning_v18 **[New Infolabel]** \link ListItem_GameClient `ListItem.GameClient`\endlink
6661 /// <p>
6662 /// }
6663 /// \table_row3{ <b>`ListItem.Property(propname)`</b>,
6664 /// \anchor ListItem_Property_Propname
6665 /// _string_,
6666 /// @return The requested property of a ListItem.
6667 /// @param propname - the property requested
6668 /// <p>
6669 /// }
6670 /// \table_row3{ <b>`ListItem.Property(Role.Composer)`</b>,
6671 /// \anchor ListItem_Property_Role_Composer
6672 /// _string_,
6673 /// @return The name of the person who composed the selected song.
6674 /// <p><hr>
6675 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Composer `ListItem.Property(Role.Composer)`\endlink
6676 /// <p>
6677 /// }
6678 /// \table_row3{ <b>`ListItem.Property(Role.Conductor)`</b>,
6679 /// \anchor ListItem_Property_Role_Conductor
6680 /// _string_,
6681 /// @return The name of the person who conducted the selected song.
6682 /// <p><hr>
6683 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Conductor `ListItem.Property(Role.Conductor)`\endlink
6684 /// <p>
6685 /// }
6686 /// \table_row3{ <b>`ListItem.Property(Role.Orchestra)`</b>,
6687 /// \anchor ListItem_Property_Role_Orchestra
6688 /// _string_,
6689 /// @return The name of the orchestra performing the selected song.
6690 /// <p><hr>
6691 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Orchestra `ListItem.Property(Role.Orchestra)`\endlink
6692 /// <p>
6693 /// }
6694 /// \table_row3{ <b>`ListItem.Property(Role.Lyricist)`</b>,
6695 /// \anchor ListItem_Property_Role_Lyricist
6696 /// _string_,
6697 /// @return The name of the person who wrote the lyrics of the selected song.
6698 /// <p><hr>
6699 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Lyricist `ListItem.Property(Role.Lyricist)`\endlink
6700 /// <p>
6701 /// }
6702 /// \table_row3{ <b>`ListItem.Property(Role.Remixer)`</b>,
6703 /// \anchor ListItem_Property_Role_Remixer
6704 /// _string_,
6705 /// @return The name of the person who remixed the selected song.
6706 /// <p><hr>
6707 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Remixer `ListItem.Property(Role.Remixer)`\endlink
6708 /// <p>
6709 /// }
6710 /// \table_row3{ <b>`ListItem.Property(Role.Arranger)`</b>,
6711 /// \anchor ListItem_Property_Role_Arranger
6712 /// _string_,
6713 /// @return The name of the person who arranged the selected song.
6714 /// <p><hr>
6715 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Arranger `ListItem.Property(Role.Arranger)`\endlink
6716 /// <p>
6717 /// }
6718 /// \table_row3{ <b>`ListItem.Property(Role.Engineer)`</b>,
6719 /// \anchor ListItem_Property_Role_Engineer
6720 /// _string_,
6721 /// @return The name of the person who was the engineer of the selected song.
6722 /// <p><hr>
6723 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Engineer `ListItem.Property(Role.Engineer)`\endlink
6724 /// <p>
6725 /// }
6726 /// \table_row3{ <b>`ListItem.Property(Role.Producer)`</b>,
6727 /// \anchor ListItem_Property_Role_Producer
6728 /// _string_,
6729 /// @return The name of the person who produced the selected song.
6730 /// <p><hr>
6731 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Producer `ListItem.Property(Role.Producer)`\endlink
6732 /// <p>
6733 /// }
6734 /// \table_row3{ <b>`ListItem.Property(Role.DJMixer)`</b>,
6735 /// \anchor ListItem_Property_Role_DJMixer
6736 /// _string_,
6737 /// @return The name of the dj who remixed the selected song.
6738 /// <p><hr>
6739 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6740 /// <p>
6741 /// }
6742 /// \table_row3{ <b>`ListItem.Property(Role.Mixer)`</b>,
6743 /// \anchor ListItem_Property_Role_Mixer
6744 /// _string_,
6745 /// @return The name of the person who mixed the selected song.
6746 /// <p><hr>
6747 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6748 /// <p>
6749 /// }
6750 /// \table_row3{ <b>`ListItem.Property(Game.VideoFilter)`</b>,
6751 /// \anchor ListItem_Property_Game_VideoFilter
6752 /// _string_,
6753 /// @return The video filter of the list item representing a
6754 /// gamewindow control (RETROPLAYER).
6755 /// See \link RetroPlayer_VideoFilter RetroPlayer.VideoFilter \endlink
6756 /// for the possible values.
6757 /// <p><hr>
6758 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoFilter `ListItem.Property(Game.VideoFilter)`\endlink
6759 /// <p>
6760 /// }
6761 /// \table_row3{ <b>`ListItem.Property(Game.StretchMode)`</b>,
6762 /// \anchor ListItem_Property_Game_StretchMode
6763 /// _string_,
6764 /// @return The stretch mode of the list item representing a
6765 /// gamewindow control (RETROPLAYER).
6766 /// See \link RetroPlayer_StretchMode RetroPlayer.StretchMode \endlink
6767 /// for the possible values.
6768 /// <p><hr>
6769 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_StretchMode `ListItem.Property(Game.StretchMode)`\endlink
6770 /// <p>
6771 /// }
6772 /// \table_row3{ <b>`ListItem.Property(Game.VideoRotation)`</b>,
6773 /// \anchor ListItem_Property_Game_VideoRotation
6774 /// _integer_,
6775 /// @return The video rotation of the list item representing a
6776 /// gamewindow control (RETROPLAYER).
6777 /// See \link RetroPlayer_VideoRotation RetroPlayer.VideoRotation \endlink
6778 /// for the possible values.
6779 /// <p><hr>
6780 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoRotation `ListItem.Property(Game.VideoRotation)`\endlink
6781 /// <p>
6782 /// }
6783 /// \table_row3{ <b>`ListItem.ParentalRating`</b>,
6784 /// \anchor ListItem_ParentalRating
6785 /// _string_,
6786 /// @return The parental rating of the list item (PVR).
6787 /// <p>
6788 /// }
6789 /// \table_row3{ <b>`ListItem.ParentalRatingCode`</b>,
6790 /// \anchor ListItem_ParentalRatingCode
6791 /// _string_,
6792 /// @return The parental rating code (eg: 'PG'\, etc) of the list item (PVR).
6793 /// <p><hr>
6794 /// @skinning_v21 **[New Infolabel]** \link ListItem_ParentalRatingCode `ListItem.ParentalRatingCode`\endlink
6795 /// <p>
6796 /// }
6797 /// \table_row3{ <b>`ListItem.CurrentItem`</b>,
6798 /// \anchor ListItem_CurrentItem
6799 /// _string_,
6800 /// @return The current index of the item in a container starting at 1.
6801 /// <p><hr>
6802 /// @skinning_v19 **[New Infolabel]** \link ListItem_CurrentItem `ListItem.CurrentItem`\endlink
6803 /// <p>
6804 /// }
6805 /// \table_row3{ <b>`ListItem.IsNew`</b>,
6806 /// \anchor ListItem_IsNew
6807 /// _boolean_,
6808 /// @return **True** if the item is new (for example\, a Live TV show that will be first aired).
6809 /// <p><hr>
6810 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsNew `ListItem.IsNew`\endlink
6811 /// <p>
6812 /// }
6813 /// \table_row3{ <b>`ListItem.IsPremiere`</b>,
6814 /// \anchor ListItem_IsPremiere
6815 /// _boolean_,
6816 /// @return **True** if the item is a premiere (for example\, a Movie first showing or season first on Live TV).
6817 /// <p><hr>
6818 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsPremiere `ListItem.IsPremiere`\endlink
6819 /// <p>
6820 /// }
6821 /// \table_row3{ <b>`ListItem.IsFinale`</b>,
6822 /// \anchor ListItem_IsFinale
6823 /// _boolean_,
6824 /// @return **True** if the item is a finale (for example\, a season finale showing on Live TV).
6825 /// <p><hr>
6826 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsFinale `ListItem.IsFinale`\endlink
6827 /// <p>
6828 /// }
6829 /// \table_row3{ <b>`ListItem.IsLive`</b>,
6830 /// \anchor ListItem_IsLive
6831 /// _boolean_,
6832 /// @return **True** if the item is live (for example\, a Live TV sports event).
6833 /// <p><hr>
6834 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsLive `ListItem.IsLive`\endlink
6835 /// <p>
6836 /// }
6837 /// \table_row3{ <b>`ListItem.DiscTitle`</b>,
6838 /// \anchor ListItem_DiscTitle
6839 /// _string_,
6840 /// @return The disc title of the currently selected album or song.
6841 /// <p><hr>
6842 /// @skinning_v19 **[New Infolabel]** \link ListItem_DiscTitle `ListItem.DiscTitle`\endlink
6843 /// <p>
6844 /// }
6845 /// \table_row3{ <b>`ListItem.IsBoxset`</b>,
6846 /// \anchor ListItem_IsBoxset
6847 /// _boolean_,
6848 /// @return **True** if the item is part of a boxset album.
6849 /// <p><hr>
6850 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsBoxset `ListItem.IsBoxset`\endlink
6851 /// <p>
6852 /// }
6853 /// \table_row3{ <b>`ListItem.TotalDiscs`</b>,
6854 /// \anchor ListItem_TotalDiscs
6855 /// _boolean_,
6856 /// @return The total number of discs belonging to an album.
6857 /// <p><hr>
6858 /// @skinning_v19 **[New Infolabel]** \link ListItem_TotalDiscs `ListItem.TotalDiscs`\endlink
6859 /// <p>
6860 /// }
6861 /// \table_row3{ <b>`ListItem.ReleaseDate`</b>,
6862 /// \anchor ListItem_ReleaseDate
6863 /// _string_,
6864 /// @return The release date of the item.
6865 /// <p><hr>
6866 /// @skinning_v19 **[New Infolabel]** \link ListItem_ReleaseDate `ListItem.ReleaseDate`\endlink
6867 /// <p>
6868 /// }
6869 /// \table_row3{ <b>`ListItem.OriginalDate`</b>,
6870 /// \anchor ListItem_OriginalDate
6871 /// _string_,
6872 /// @return The original release date of the item. Can be full or partial date.
6873 /// <p><hr>
6874 /// @skinning_v19 **[New Infolabel]** \link ListItem_OriginalDate `ListItem.OriginalDate`\endlink
6875 /// <p>
6876 /// }
6877 /// \table_row3{ <b>`ListItem.BPM`</b>,
6878 /// \anchor ListItem_BPM
6879 /// _string_,
6880 /// @return The BPM of a song.
6881 /// <p><hr>
6882 /// @skinning_v19 **[New Infolabel]** \link ListItem_BPM `ListItem.BPM`\endlink
6883 /// <p>
6884 /// }
6885 /// \table_row3{ <b>`ListItem.UniqueID(name)`</b>,
6886 /// \anchor ListItem_UniqueID
6887 /// _string_,
6888 /// @return The scraped metadata id of the currently selected item in a container\,
6889 /// for use in dialogvideoinfo.xml.
6890 /// @param name - the name of the metadata provider.
6891 /// <p><hr>
6892 /// @skinning_v19 **[New Infolabel]** \link ListItem_UniqueID `ListItem.UniqueID(name)`\endlink
6893 /// <p>
6894 /// }
6895 /// \table_row3{ <b>`ListItem.BitRate`</b>,
6896 /// \anchor ListItem_BitRate
6897 /// _string_,
6898 /// @return The bitrate of a song. Actual rate for CBR\, average rate for VBR.
6899 /// <p><hr>
6900 /// @skinning_v19 **[New Infolabel]** \link ListItem_BitRate `ListItem.BitRate`\endlink
6901 /// <p>
6902 /// }
6903 /// \table_row3{ <b>`ListItem.SampleRate`</b>,
6904 /// \anchor ListItem_SampleRate
6905 /// _string_,
6906 /// @return The sample rate of a song / 1000.0 eg 44.1\, 48\, 96 etc.
6907 /// <p><hr>
6908 /// @skinning_v19 **[New Infolabel]** \link ListItem_SampleRate `ListItem.SampleRate`\endlink
6909 /// <p>
6910 /// }
6911 /// \table_row3{ <b>`ListItem.MusicChannels`</b>,
6912 /// \anchor ListItem_MusicChannels
6913 /// _string_,
6914 /// @return The number of audio channels of a song.
6915 /// <p><hr>
6916 /// @skinning_v19 **[New Infolabel]** \link ListItem_No_Of_Channels `ListItem.NoOfChannels`\endlink
6917 /// <p>
6918 /// }
6919 /// \table_row3{ <b>`ListItem.TvShowDBID`</b>,
6920 /// \anchor ListItem_TvShowDBID
6921 /// _string_,
6922 /// @return The database id of the TvShow for the currently selected Season or Episode.
6923 /// <p><hr>
6924 /// @skinning_v19 **[New Infolabel]** \link ListItem_TvShowDBID `ListItem.TvShowDBID`\endlink
6925 /// <p>
6926 /// }
6927 /// \table_row3{ <b>`ListItem.AlbumStatus`</b>,
6928 /// \anchor ListItem_AlbumStatus
6929 /// _string_,
6930 /// @return The Musicbrainz release status of the album (official\, bootleg\, promotion etc)
6931 /// <p><hr>
6932 /// @skinning_v19 **[New Infolabel]** \link ListItem_AlbumStatus `ListItem.AlbumStatus`\endlink
6933 /// }
6934 /// \table_row3{ <b>`ListItem.HdrType`</b>,
6935 /// \anchor ListItem_HdrType
6936 /// _string_,
6937 /// @return String containing the name of the detected HDR type or empty if not HDR. See \ref StreamHdrType for the list of possible values.
6938 /// <p><hr>
6939 /// @skinning_v20 **[New Infolabel]** \link ListItem_HdrType `ListItem.HdrType`\endlink
6940 /// }
6941 /// \table_row3{ <b>`ListItem.SongVideoURL`</b>,
6942 /// \anchor ListItem_SongVideoURL
6943 /// _string_,
6944 /// @return Link to a video of a song
6945 /// <p><hr>
6946 /// @skinning_v21 **[New Infolabel]** \link ListItem_SongVideoURL `ListItem.SongVideoURL`\endlink
6947 /// }
6948 /// \table_row3{ <b>`ListItem.VideoWidth`</b>,
6949 /// \anchor ListItem_VideoWidth
6950 /// _string_,
6951 /// @return String containing width of video in pixels - empty if unknown.
6952 /// <p><hr>
6953 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoWidth `ListItem.VideoWidth`\endlink
6954 /// }
6955 /// \table_row3{ <b>`ListItem.VideoHeight`</b>,
6956 /// \anchor ListItem_VideoHeight
6957 /// _string_,
6958 /// @return String containing height of video in pixels - empty if unknown.
6959 /// <p><hr>
6960 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoHeight `ListItem.VideoHeight`\endlink
6961 /// }
6962 /// \table_row3{ <b>`ListItem.HasVideoVersions`</b>,
6963 /// \anchor ListItem_HasVideoVersions
6964 /// _boolean_,
6965 /// @return **True** when the selected item has multiple video versions.
6966 /// <p><hr>
6967 /// @skinning_v21 **[New Infolabel]** \link ListItem_HasVideoVersions `ListItem.HasVideoVersions`\endlink
6968 /// }
6969 /// \table_row3{ <b>`ListItem.IsVideoExtra`</b>,
6970 /// \anchor ListItem_IsVideoExtra
6971 /// _boolean_,
6972 /// @return **True** when the selected item is a video extra.
6973 /// <p><hr>
6974 /// @skinning_v21 **[New Infolabel]** \link ListItem_IsVideoExtra `ListItem.IsVideoExtra`\endlink
6975 /// }
6976 /// \table_row3{ <b>`ListItem.VideoVersionName`</b>,
6977 /// \anchor ListItem_VideoVersionName
6978 /// _string_,
6979 /// @return String containing the name of the version of a video - empty for extras or if no version available
6980 /// <p><hr>
6981 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoVersionName `ListItem.VideoVersionName`\endlink
6982 /// }
6983 /// \table_row3{ <b>`ListItem.HasVideoExtras`</b>,
6984 /// \anchor ListItem_HasVideoExtras
6985 /// _boolean_,
6986 /// @return **True** when the selected item has video extras.
6987 /// <p><hr>
6988 /// @skinning_v21 **[New Infolabel]** \link ListItem_HasVideoExtras `ListItem.HasVideoExtras`\endlink
6989 /// }
6990 /// \table_row3{ <b>`ListItem.PVRClientName`</b>,
6991 /// \anchor ListItem_PVRClientName
6992 /// _string_,
6993 /// @return If selected item is of type PVR (recording\, timer\, EPG)\, the name of the PVR client
6994 /// add-on\, as specified by the add-on developer. Empty if theitem is not of type PVR.
6995 /// <p><hr>
6996 /// @skinning_v22 **[New Infolabel]** \link ListItem_PVRClientName `ListItem.PVRClientName`\endlink
6997 /// <p>
6998 /// }
6999 /// \table_row3{ <b>`ListItem.PVRInstanceName`</b>,
7000 /// \anchor ListItem_PVRInstanceName
7001 /// _string_,
7002 /// @return If selected item is of type PVR (recording\, timer\, EPG)\, the name of the instance
7003 /// of the PVR client add-on\, as specified by the user in the add-on settings. Empty if the
7004 /// PVR client add-on does not support multiple instances or item is not of type PVR.
7005 /// <p><hr>
7006 /// @skinning_v22 **[New Infolabel]** \link ListItem_PVRInstanceName `ListItem.PVRInstanceName`\endlink
7007 /// <p>
7008 /// }
7009 /// \table_end
7011 /// -----------------------------------------------------------------------------
7012 // clang-format off
7013 const infomap listitem_labels[]= {{ "thumb", LISTITEM_THUMB },
7014 { "icon", LISTITEM_ICON },
7015 { "actualicon", LISTITEM_ACTUAL_ICON },
7016 { "overlay", LISTITEM_OVERLAY },
7017 { "label", LISTITEM_LABEL },
7018 { "label2", LISTITEM_LABEL2 },
7019 { "title", LISTITEM_TITLE },
7020 { "tracknumber", LISTITEM_TRACKNUMBER },
7021 { "artist", LISTITEM_ARTIST },
7022 { "album", LISTITEM_ALBUM },
7023 { "albumartist", LISTITEM_ALBUM_ARTIST },
7024 { "year", LISTITEM_YEAR },
7025 { "genre", LISTITEM_GENRE },
7026 { "contributors", LISTITEM_CONTRIBUTORS },
7027 { "contributorandrole", LISTITEM_CONTRIBUTOR_AND_ROLE },
7028 { "director", LISTITEM_DIRECTOR },
7029 { "disctitle", LISTITEM_DISC_TITLE },
7030 { "filename", LISTITEM_FILENAME },
7031 { "filenameandpath", LISTITEM_FILENAME_AND_PATH },
7032 { "fileextension", LISTITEM_FILE_EXTENSION },
7033 { "filenamenoextension", LISTITEM_FILENAME_NO_EXTENSION },
7034 { "date", LISTITEM_DATE },
7035 { "datetime", LISTITEM_DATETIME },
7036 { "size", LISTITEM_SIZE },
7037 { "rating", LISTITEM_RATING },
7038 { "ratingandvotes", LISTITEM_RATING_AND_VOTES },
7039 { "userrating", LISTITEM_USER_RATING },
7040 { "votes", LISTITEM_VOTES },
7041 { "mood", LISTITEM_MOOD },
7042 { "programcount", LISTITEM_PROGRAM_COUNT },
7043 { "duration", LISTITEM_DURATION },
7044 { "isselected", LISTITEM_ISSELECTED },
7045 { "isplaying", LISTITEM_ISPLAYING },
7046 { "plot", LISTITEM_PLOT },
7047 { "plotoutline", LISTITEM_PLOT_OUTLINE },
7048 { "episode", LISTITEM_EPISODE },
7049 { "season", LISTITEM_SEASON },
7050 { "tvshowtitle", LISTITEM_TVSHOW },
7051 { "premiered", LISTITEM_PREMIERED },
7052 { "comment", LISTITEM_COMMENT },
7053 { "path", LISTITEM_PATH },
7054 { "foldername", LISTITEM_FOLDERNAME },
7055 { "folderpath", LISTITEM_FOLDERPATH },
7056 { "picturepath", LISTITEM_PICTURE_PATH },
7057 { "pictureresolution",LISTITEM_PICTURE_RESOLUTION },
7058 { "picturedatetime", LISTITEM_PICTURE_DATETIME },
7059 { "picturedate", LISTITEM_PICTURE_DATE },
7060 { "picturelongdatetime",LISTITEM_PICTURE_LONGDATETIME },
7061 { "picturelongdate", LISTITEM_PICTURE_LONGDATE },
7062 { "picturecomment", LISTITEM_PICTURE_COMMENT },
7063 { "picturecaption", LISTITEM_PICTURE_CAPTION },
7064 { "picturedesc", LISTITEM_PICTURE_DESC },
7065 { "picturekeywords", LISTITEM_PICTURE_KEYWORDS },
7066 { "picturecammake", LISTITEM_PICTURE_CAM_MAKE },
7067 { "picturecammodel", LISTITEM_PICTURE_CAM_MODEL },
7068 { "pictureaperture", LISTITEM_PICTURE_APERTURE },
7069 { "picturefocallen", LISTITEM_PICTURE_FOCAL_LEN },
7070 { "picturefocusdist", LISTITEM_PICTURE_FOCUS_DIST },
7071 { "pictureexpmode", LISTITEM_PICTURE_EXP_MODE },
7072 { "pictureexptime", LISTITEM_PICTURE_EXP_TIME },
7073 { "pictureiso", LISTITEM_PICTURE_ISO },
7074 { "pictureauthor", LISTITEM_PICTURE_AUTHOR },
7075 { "picturebyline", LISTITEM_PICTURE_BYLINE },
7076 { "picturebylinetitle", LISTITEM_PICTURE_BYLINE_TITLE },
7077 { "picturecategory", LISTITEM_PICTURE_CATEGORY },
7078 { "pictureccdwidth", LISTITEM_PICTURE_CCD_WIDTH },
7079 { "picturecity", LISTITEM_PICTURE_CITY },
7080 { "pictureurgency", LISTITEM_PICTURE_URGENCY },
7081 { "picturecopyrightnotice", LISTITEM_PICTURE_COPYRIGHT_NOTICE },
7082 { "picturecountry", LISTITEM_PICTURE_COUNTRY },
7083 { "picturecountrycode", LISTITEM_PICTURE_COUNTRY_CODE },
7084 { "picturecredit", LISTITEM_PICTURE_CREDIT },
7085 { "pictureiptcdate", LISTITEM_PICTURE_IPTCDATE },
7086 { "picturedigitalzoom", LISTITEM_PICTURE_DIGITAL_ZOOM },
7087 { "pictureexposure", LISTITEM_PICTURE_EXPOSURE },
7088 { "pictureexposurebias", LISTITEM_PICTURE_EXPOSURE_BIAS },
7089 { "pictureflashused", LISTITEM_PICTURE_FLASH_USED },
7090 { "pictureheadline", LISTITEM_PICTURE_HEADLINE },
7091 { "picturecolour", LISTITEM_PICTURE_COLOUR },
7092 { "picturelightsource", LISTITEM_PICTURE_LIGHT_SOURCE },
7093 { "picturemeteringmode", LISTITEM_PICTURE_METERING_MODE },
7094 { "pictureobjectname", LISTITEM_PICTURE_OBJECT_NAME },
7095 { "pictureorientation", LISTITEM_PICTURE_ORIENTATION },
7096 { "pictureprocess", LISTITEM_PICTURE_PROCESS },
7097 { "picturereferenceservice", LISTITEM_PICTURE_REF_SERVICE },
7098 { "picturesource", LISTITEM_PICTURE_SOURCE },
7099 { "picturespecialinstructions", LISTITEM_PICTURE_SPEC_INSTR },
7100 { "picturestate", LISTITEM_PICTURE_STATE },
7101 { "picturesupplementalcategories", LISTITEM_PICTURE_SUP_CATEGORIES },
7102 { "picturetransmissionreference", LISTITEM_PICTURE_TX_REFERENCE },
7103 { "picturewhitebalance", LISTITEM_PICTURE_WHITE_BALANCE },
7104 { "pictureimagetype", LISTITEM_PICTURE_IMAGETYPE },
7105 { "picturesublocation", LISTITEM_PICTURE_SUBLOCATION },
7106 { "pictureiptctime", LISTITEM_PICTURE_TIMECREATED },
7107 { "picturegpslat", LISTITEM_PICTURE_GPS_LAT },
7108 { "picturegpslon", LISTITEM_PICTURE_GPS_LON },
7109 { "picturegpsalt", LISTITEM_PICTURE_GPS_ALT },
7110 { "studio", LISTITEM_STUDIO },
7111 { "country", LISTITEM_COUNTRY },
7112 { "mpaa", LISTITEM_MPAA },
7113 { "cast", LISTITEM_CAST },
7114 { "castandrole", LISTITEM_CAST_AND_ROLE },
7115 { "writer", LISTITEM_WRITER },
7116 { "tagline", LISTITEM_TAGLINE },
7117 { "status", LISTITEM_STATUS },
7118 { "top250", LISTITEM_TOP250 },
7119 { "trailer", LISTITEM_TRAILER },
7120 { "sortletter", LISTITEM_SORT_LETTER },
7121 { "tag", LISTITEM_TAG },
7122 { "set", LISTITEM_SET },
7123 { "setid", LISTITEM_SETID },
7124 { "videocodec", LISTITEM_VIDEO_CODEC },
7125 { "videoresolution", LISTITEM_VIDEO_RESOLUTION },
7126 { "videowidth", LISTITEM_VIDEO_WIDTH},
7127 { "videoheight", LISTITEM_VIDEO_HEIGHT},
7128 { "videoaspect", LISTITEM_VIDEO_ASPECT },
7129 { "audiocodec", LISTITEM_AUDIO_CODEC },
7130 { "audiochannels", LISTITEM_AUDIO_CHANNELS },
7131 { "audiolanguage", LISTITEM_AUDIO_LANGUAGE },
7132 { "subtitlelanguage", LISTITEM_SUBTITLE_LANGUAGE },
7133 { "isresumable", LISTITEM_IS_RESUMABLE},
7134 { "percentplayed", LISTITEM_PERCENT_PLAYED},
7135 { "isfolder", LISTITEM_IS_FOLDER },
7136 { "isparentfolder", LISTITEM_IS_PARENTFOLDER },
7137 { "iscollection", LISTITEM_IS_COLLECTION },
7138 { "originaltitle", LISTITEM_ORIGINALTITLE },
7139 { "lastplayed", LISTITEM_LASTPLAYED },
7140 { "playcount", LISTITEM_PLAYCOUNT },
7141 { "discnumber", LISTITEM_DISC_NUMBER },
7142 { "starttime", LISTITEM_STARTTIME },
7143 { "endtime", LISTITEM_ENDTIME },
7144 { "endtimeresume", LISTITEM_ENDTIME_RESUME },
7145 { "startdate", LISTITEM_STARTDATE },
7146 { "enddate", LISTITEM_ENDDATE },
7147 { "nexttitle", LISTITEM_NEXT_TITLE },
7148 { "nextgenre", LISTITEM_NEXT_GENRE },
7149 { "nextplot", LISTITEM_NEXT_PLOT },
7150 { "nextplotoutline", LISTITEM_NEXT_PLOT_OUTLINE },
7151 { "nextstarttime", LISTITEM_NEXT_STARTTIME },
7152 { "nextendtime", LISTITEM_NEXT_ENDTIME },
7153 { "nextstartdate", LISTITEM_NEXT_STARTDATE },
7154 { "nextenddate", LISTITEM_NEXT_ENDDATE },
7155 { "nextduration", LISTITEM_NEXT_DURATION },
7156 { "channelname", LISTITEM_CHANNEL_NAME },
7157 { "channellogo", LISTITEM_CHANNEL_LOGO },
7158 { "channelnumberlabel", LISTITEM_CHANNEL_NUMBER },
7159 { "channelgroup", LISTITEM_CHANNEL_GROUP },
7160 { "hasepg", LISTITEM_HAS_EPG },
7161 { "hastimer", LISTITEM_HASTIMER },
7162 { "hastimerschedule", LISTITEM_HASTIMERSCHEDULE },
7163 { "hasreminder", LISTITEM_HASREMINDER },
7164 { "hasreminderrule", LISTITEM_HASREMINDERRULE },
7165 { "hasrecording", LISTITEM_HASRECORDING },
7166 { "isrecording", LISTITEM_ISRECORDING },
7167 { "isplayable", LISTITEM_ISPLAYABLE },
7168 { "hasarchive", LISTITEM_HASARCHIVE },
7169 { "inprogress", LISTITEM_INPROGRESS },
7170 { "isencrypted", LISTITEM_ISENCRYPTED },
7171 { "progress", LISTITEM_PROGRESS },
7172 { "dateadded", LISTITEM_DATE_ADDED },
7173 { "dbtype", LISTITEM_DBTYPE },
7174 { "dbid", LISTITEM_DBID },
7175 { "appearances", LISTITEM_APPEARANCES },
7176 { "stereoscopicmode", LISTITEM_STEREOSCOPIC_MODE },
7177 { "isstereoscopic", LISTITEM_IS_STEREOSCOPIC },
7178 { "imdbnumber", LISTITEM_IMDBNUMBER },
7179 { "episodename", LISTITEM_EPISODENAME },
7180 { "timertype", LISTITEM_TIMERTYPE },
7181 { "epgeventtitle", LISTITEM_EPG_EVENT_TITLE },
7182 { "epgeventicon", LISTITEM_EPG_EVENT_ICON },
7183 { "timerisactive", LISTITEM_TIMERISACTIVE },
7184 { "timerhaserror", LISTITEM_TIMERHASERROR },
7185 { "timerhasconflict", LISTITEM_TIMERHASCONFLICT },
7186 { "addonname", LISTITEM_ADDON_NAME },
7187 { "addonversion", LISTITEM_ADDON_VERSION },
7188 { "addoncreator", LISTITEM_ADDON_CREATOR },
7189 { "addonsummary", LISTITEM_ADDON_SUMMARY },
7190 { "addondescription", LISTITEM_ADDON_DESCRIPTION },
7191 { "addondisclaimer", LISTITEM_ADDON_DISCLAIMER },
7192 { "addonnews", LISTITEM_ADDON_NEWS },
7193 { "addonbroken", LISTITEM_ADDON_BROKEN },
7194 { "addonlifecycletype", LISTITEM_ADDON_LIFECYCLE_TYPE },
7195 { "addonlifecycledesc", LISTITEM_ADDON_LIFECYCLE_DESC },
7196 { "addontype", LISTITEM_ADDON_TYPE },
7197 { "addoninstalldate", LISTITEM_ADDON_INSTALL_DATE },
7198 { "addonlastupdated", LISTITEM_ADDON_LAST_UPDATED },
7199 { "addonlastused", LISTITEM_ADDON_LAST_USED },
7200 { "addonorigin", LISTITEM_ADDON_ORIGIN },
7201 { "addonsize", LISTITEM_ADDON_SIZE },
7202 { "expirationdate", LISTITEM_EXPIRATION_DATE },
7203 { "expirationtime", LISTITEM_EXPIRATION_TIME },
7204 { "art", LISTITEM_ART },
7205 { "property", LISTITEM_PROPERTY },
7206 { "parentalrating", LISTITEM_PARENTAL_RATING },
7207 { "parentalratingcode", LISTITEM_PARENTAL_RATING_CODE },
7208 { "currentitem", LISTITEM_CURRENTITEM },
7209 { "isnew", LISTITEM_IS_NEW },
7210 { "isboxset", LISTITEM_IS_BOXSET },
7211 { "totaldiscs", LISTITEM_TOTALDISCS },
7212 { "releasedate", LISTITEM_RELEASEDATE },
7213 { "originaldate", LISTITEM_ORIGINALDATE },
7214 { "bpm", LISTITEM_BPM },
7215 { "uniqueid", LISTITEM_UNIQUEID },
7216 { "bitrate", LISTITEM_BITRATE },
7217 { "samplerate", LISTITEM_SAMPLERATE },
7218 { "musicchannels", LISTITEM_MUSICCHANNELS },
7219 { "ispremiere", LISTITEM_IS_PREMIERE },
7220 { "isfinale", LISTITEM_IS_FINALE },
7221 { "islive", LISTITEM_IS_LIVE },
7222 { "tvshowdbid", LISTITEM_TVSHOWDBID },
7223 { "albumstatus", LISTITEM_ALBUMSTATUS },
7224 { "isautoupdateable", LISTITEM_ISAUTOUPDATEABLE },
7225 { "hdrtype", LISTITEM_VIDEO_HDR_TYPE },
7226 { "songvideourl", LISTITEM_SONG_VIDEO_URL },
7227 { "hasvideoversions", LISTITEM_HASVIDEOVERSIONS },
7228 { "isvideoextra", LISTITEM_ISVIDEOEXTRA },
7229 { "videoversionname", LISTITEM_VIDEOVERSION_NAME },
7230 { "hasvideoextras", LISTITEM_HASVIDEOEXTRAS },
7231 { "pvrclientname", LISTITEM_PVR_CLIENT_NAME },
7232 { "pvrinstancename", LISTITEM_PVR_INSTANCE_NAME },
7234 // clang-format on
7236 /// \page modules__infolabels_boolean_conditions
7237 /// \subsection modules__infolabels_boolean_conditions_Visualisation Visualisation
7238 /// \table_start
7239 /// \table_h3{ Labels, Type, Description }
7240 /// \table_row3{ <b>`Visualisation.Enabled`</b>,
7241 /// \anchor Visualisation_Enabled
7242 /// _boolean_,
7243 /// @return **True** if any visualisation has been set in settings (so not None).
7244 /// <p>
7245 /// }
7246 /// \table_row3{ <b>`Visualisation.HasPresets`</b>,
7247 /// \anchor Visualisation_HasPresets
7248 /// _boolean_,
7249 /// @return **True** if the visualisation has built in presets.
7250 /// <p><hr>
7251 /// @skinning_v16 **[New Boolean Condition]** \link Visualisation_HasPresets `Visualisation.HasPresets`\endlink
7252 /// <p>
7253 /// }
7254 /// \table_row3{ <b>`Visualisation.Locked`</b>,
7255 /// \anchor Visualisation_Locked
7256 /// _boolean_,
7257 /// @return **True** if the current visualisation preset is locked (e.g. in Milkdrop).
7258 /// <p>
7259 /// }
7260 /// \table_row3{ <b>`Visualisation.Preset`</b>,
7261 /// \anchor Visualisation_Preset
7262 /// _string_,
7263 /// @return The current preset of the visualisation.
7264 /// <p>
7265 /// }
7266 /// \table_row3{ <b>`Visualisation.Name`</b>,
7267 /// \anchor Visualisation_Name
7268 /// _string_,
7269 /// @return the name of the visualisation.
7270 /// <p>
7271 /// }
7272 /// \table_end
7274 /// -----------------------------------------------------------------------------
7275 const infomap visualisation[] = {{ "locked", VISUALISATION_LOCKED },
7276 { "preset", VISUALISATION_PRESET },
7277 { "haspresets", VISUALISATION_HAS_PRESETS },
7278 { "name", VISUALISATION_NAME },
7279 { "enabled", VISUALISATION_ENABLED }};
7281 /// \page modules__infolabels_boolean_conditions
7282 /// \subsection modules__infolabels_boolean_conditions_Fanart Fanart
7283 /// \table_start
7284 /// \table_h3{ Labels, Type, Description }
7285 /// \table_row3{ <b>`Fanart.Color1`</b>,
7286 /// \anchor Fanart_Color1
7287 /// _string_,
7288 /// @return The first of three colors included in the currently selected
7289 /// Fanart theme for the parent TV Show.
7290 /// @note Colors are arranged Lightest to Darkest.
7291 /// <p>
7292 /// }
7293 /// \table_row3{ <b>`Fanart.Color2`</b>,
7294 /// \anchor Fanart_Color2
7295 /// _string_,
7296 /// @return The second of three colors included in the currently selected
7297 /// Fanart theme for the parent TV Show.
7298 /// @note Colors are arranged Lightest to Darkest.
7299 /// <p>
7300 /// }
7301 /// \table_row3{ <b>`Fanart.Color3`</b>,
7302 /// \anchor Fanart_Color3
7303 /// _string_,
7304 /// @return The third of three colors included in the currently selected
7305 /// Fanart theme for the parent TV Show.
7306 /// @note Colors are arranged Lightest to Darkest.
7307 /// <p>
7308 /// }
7309 /// \table_row3{ <b>`Fanart.Image`</b>,
7310 /// \anchor Fanart_Image
7311 /// _string_,
7312 /// @return The fanart image\, if any
7313 /// <p>
7314 /// }
7315 /// \table_end
7317 /// -----------------------------------------------------------------------------
7318 const infomap fanart_labels[] = {{ "color1", FANART_COLOR1 },
7319 { "color2", FANART_COLOR2 },
7320 { "color3", FANART_COLOR3 },
7321 { "image", FANART_IMAGE }};
7323 /// \page modules__infolabels_boolean_conditions
7324 /// \subsection modules__infolabels_boolean_conditions_Skin Skin
7325 /// \table_start
7326 /// \table_h3{ Labels, Type, Description }
7327 /// \table_row3{ <b>`Skin.HasSetting(setting)`</b>,
7328 /// \anchor Skin_HasSetting
7329 /// _boolean_,
7330 /// @param setting - the requested skin setting
7331 /// @return **True** if the requested skin setting is true\, false otherwise.
7332 /// @sa \link Skin_SetBool `Skin.SetBool(setting[\,value])`
7333 /// <p>
7334 /// }
7335 /// \table_row3{ <b>`Skin.String(setting)`</b>,
7336 /// \anchor Skin_StringValue
7337 /// _string_,
7338 /// @param setting - the requested skin setting
7339 /// @return The value of the requested string setting (as a string)
7340 /// @sa \link Skin_SetString `Skin.SetString(setting[\,value])`\endlink
7341 /// <p>
7342 /// }
7343 /// \table_row3{ <b>`Skin.String(setting[\,value])`</b>,
7344 /// \anchor Skin_StringCompare
7345 /// _boolean_,
7346 /// @param setting - the requested skin setting
7347 /// @param value [opt] - the string value to compare the requested setting to
7348 /// @return **True** if the setting value equals the provided value\, false otherwise.
7349 /// @sa \link Skin_SetString `Skin.SetString(setting[\,value])`\endlink
7350 /// <p>
7351 /// }
7352 /// \table_row3{ <b>`Skin.HasTheme(theme)`</b>,
7353 /// \anchor Skin_HasTheme
7354 /// _boolean_,
7355 /// @param theme - the requested skin theme
7356 /// @return **True** if the requested theme is enabled\, false otherwise.
7357 /// @sa \link Skin_CycleTheme `Skin.Theme()`\endlink and \link Skin_CurrentTheme `Skin.CurrentTheme`\endlink.
7358 /// <p>
7359 /// }
7360 /// \table_row3{ <b>`Skin.CurrentTheme`</b>,
7361 /// \anchor Skin_CurrentTheme
7362 /// _string_,
7363 /// @return The current selected skin theme.
7364 /// <p>
7365 /// }
7366 /// \table_row3{ <b>`Skin.CurrentColourTheme`</b>,
7367 /// \anchor Skin_CurrentColourTheme
7368 /// _string_,
7369 /// @return the current selected colour theme of the skin.
7370 /// <p>
7371 /// }
7372 /// \table_row3{ <b>`Skin.AspectRatio`</b>,
7373 /// \anchor Skin_AspectRatio
7374 /// _string_,
7375 /// @return The closest aspect ratio match using the resolution info from the skin's `addon.xml` file.
7376 /// <p>
7377 /// }
7378 /// \table_row3{ <b>`Skin.Font`</b>,
7379 /// \anchor Skin_Font
7380 /// _string_,
7381 /// @return the current fontset from `Font.xml`.
7382 /// <p><hr>
7383 /// @skinning_v18 **[New Infolabel]** \link Skin_Font `Skin.Font`\endlink
7384 /// <p>
7385 /// }
7386 /// \table_row3{ <b>`Skin.Numeric(settingid)`</b>,
7387 /// \anchor Skin_Numeric
7388 /// _integer_,
7389 /// @return return the setting value as an integer/numeric value.
7390 /// @sa \link Skin_SetNumeric `Skin.SetNumeric(settingid)`\endlink
7391 /// <p><hr>
7392 /// @skinning_v20 **[New Infolabel]** \link Skin_Numeric `Skin.Numeric(settingid)`\endlink
7393 /// <p>
7394 /// }
7395 /// \table_row3{ <b>`Skin.TimerElapsedSecs(timer)`</b>,
7396 /// \anchor Skin_TimerElapsedSecs
7397 /// _integer_ \, _string_,
7398 /// @return The elapsed time in seconds for the provided `timer`.
7399 /// @param timer - the timer name
7400 /// <p><hr>
7401 /// @skinning_v20 **[New Infolabel]** \link Skin_TimerElapsedSecs `Skin.TimerElapsedSecs(timer)`\endlink
7402 /// <p>
7403 /// }
7404 /// \table_row3{ <b>`Skin.TimerIsRunning(timer)`</b>,
7405 /// \anchor Skin_TimerIsRunning
7406 /// _boolean_,
7407 /// @return **True** if the given `timer` is active\, false otherwise.
7408 /// @param timer - the timer name
7409 /// <p><hr>
7410 /// @skinning_v20 **[New Infolabel]** \link Skin_TimerIsRunning `Skin.TimerIsRunning(timer)`\endlink
7411 /// <p>
7412 /// }
7413 /// \table_end
7415 /// -----------------------------------------------------------------------------
7416 const infomap skin_labels[] = {{ "currenttheme", SKIN_THEME },
7417 { "currentcolourtheme",SKIN_COLOUR_THEME },
7418 { "aspectratio", SKIN_ASPECT_RATIO},
7419 { "font", SKIN_FONT}};
7421 /// \page modules__infolabels_boolean_conditions
7422 /// \subsection modules__infolabels_boolean_conditions_Window Window
7423 /// \table_start
7424 /// \table_h3{ Labels, Type, Description }
7425 /// \table_row3{ <b>`Window.IsMedia`</b>,
7426 /// \anchor Window_IsMedia
7427 /// _boolean_,
7428 /// @return **True** if this window is a media window (programs\, music\, video\,
7429 /// scripts\, pictures)
7430 /// <p>
7431 /// }
7432 /// \table_row3{ <b>`Window.Is(window)`</b>,
7433 /// \anchor Window_Is
7434 /// _boolean_,
7435 /// @return **True** if the window with the given name is the window which is currently rendered.
7436 /// @param window - the name of the window
7437 /// @note Useful in xml files that are shared between multiple windows or dialogs.
7438 /// <p><hr>
7439 /// @skinning_v17 **[New Boolean Condition]** \ref Window_Is "Window.Is(window)"
7440 /// <p>
7441 /// }
7442 /// \table_row3{ <b>`Window.IsActive(window)`</b>,
7443 /// \anchor Window_IsActive
7444 /// _boolean_,
7445 /// @return **True** if the window with id or title _window_ is active
7446 /// @param window - the id or name of the window
7447 /// @note Excludes fade out time on dialogs
7448 /// <p>
7449 /// }
7450 /// \table_row3{ <b>`Window.IsVisible(window)`</b>,
7451 /// \anchor Window_IsVisible
7452 /// _boolean_,
7453 /// @return **True** if the window is visible
7454 /// @note Includes fade out time on dialogs
7455 /// <p>
7456 /// }
7457 /// \table_row3{ <b>`Window.IsTopmost(window)`</b>,
7458 /// \anchor Window_IsTopmost
7459 /// _boolean_,
7460 /// @return **True** if the window with id or title _window_ is on top of the
7461 /// window stack.
7462 /// @param window - the id or name of the window
7463 /// @note Excludes fade out time on dialogs
7464 /// @deprecated use \ref Window_IsDialogTopmost "Window.IsDialogTopmost(dialog)" instead
7465 /// <p>
7466 /// }
7467 /// \table_row3{ <b>`Window.IsDialogTopmost(dialog)`</b>,
7468 /// \anchor Window_IsDialogTopmost
7469 /// _boolean_,
7470 /// @return **True** if the dialog with id or title _dialog_ is on top of the
7471 /// dialog stack.
7472 /// @param window - the id or name of the window
7473 /// @note Excludes fade out time on dialogs
7474 /// <p>
7475 /// }
7476 /// \table_row3{ <b>`Window.IsModalDialogTopmost(dialog)`</b>,
7477 /// \anchor Window_IsModalDialogTopmost
7478 /// _boolean_,
7479 /// @return **True** if the dialog with id or title _dialog_ is on top of the
7480 /// modal dialog stack
7481 /// @note Excludes fade out time on dialogs
7482 /// <p>
7483 /// }
7484 /// \table_row3{ <b>`Window.Previous(window)`</b>,
7485 /// \anchor Window_Previous
7486 /// _boolean_,
7487 /// @return **True** if the window with id or title _window_ is being moved from.
7488 /// @param window - the window id or title
7489 /// @note Only valid while windows are changing.
7490 /// <p>
7491 /// }
7492 /// \table_row3{ <b>`Window.Next(window)`</b>,
7493 /// \anchor Window_Next
7494 /// _boolean_,
7495 /// @return **True** if the window with id or title _window_ is being moved to.
7496 /// @param window - the window id or title
7497 /// @note Only valid while windows are changing.
7498 /// <p>
7499 /// }
7500 /// \table_row3{ <b>`Window.Property(Addon.ID)`</b>,
7501 /// \anchor Window_Property_AddonId
7502 /// _string_,
7503 /// @return The id of the selected addon\, in `DialogAddonSettings.xml`.
7504 /// <p><hr>
7505 /// @skinning_v17 **[New Infolabel]** \link Window_Property_AddonId `Window.Property(Addon.ID)`\endlink
7506 /// <p>
7507 /// }
7508 /// \table_row3{ <b>`Window.Property(IsRadio)`</b>,
7509 /// \anchor Window_Property_IsRadio
7510 /// _string_,
7511 /// @return "true" if the window is a radio window\, empty string otherwise (for use in the PVR windows).
7512 /// <p>
7513 /// }
7514 /// \table_row3{ <b>`Window([window]).Property(key)`</b>,
7515 /// \anchor Window_Window_Property_key
7516 /// _string_,
7517 /// @return A window property.
7518 /// @param window - [opt] window id or name.
7519 /// @param key - any value.
7520 /// <p>
7521 /// }
7522 /// \table_row3{ <b>`Window(AddonBrowser).Property(Updated)`</b>,
7523 /// \anchor Window_Addonbrowser_Property_Updated
7524 /// _string_,
7525 /// @return The date and time the addon repo was last checked for updates.
7526 /// @todo move to a future window document.
7527 /// <p><hr>
7528 /// @skinning_v15 **[New Infolabel]** \link Window_Addonbrowser_Property_Updated `Window(AddonBrowser).Property(Updated)`\endlink
7529 /// <p>
7530 /// }
7531 /// \table_row3{ <b>`Window(Weather).Property(property)`</b>,
7532 /// \anchor Window_Weather_Property
7533 /// _string_,
7534 /// @return The property for the weather window.
7535 /// @param property - The requested property. The following are available:
7536 /// - Current.ConditionIcon
7537 /// - Day[0-6].OutlookIcon
7538 /// - Current.FanartCode
7539 /// - Day[0-6].FanartCode
7540 /// - WeatherProviderLogo
7541 /// - Daily.%i.OutlookIcon
7542 /// - 36Hour.%i.OutlookIcon
7543 /// - Weekend.%i.OutlookIcon
7544 /// - Hourly.%i.OutlookIcon
7545 /// @todo move to a future window document.
7546 /// <p><hr>
7547 /// @skinning_v16 **[Updated infolabel]** \link Window_Weather_Property `Window(Weather).Property(property)`\endlink
7548 /// For skins that support extended weather info\, the following infolabels have been changed:
7549 /// - Daily.%i.OutlookIcon
7550 /// - 36Hour.%i.OutlookIcon
7551 /// - Weekend.%i.OutlookIcon
7552 /// - Hourly.%i.OutlookIcon
7554 /// previously the openweathermap addon would provide the full\, hardcoded path to the icon
7555 /// ie. `resource://resource.images.weathericons.default/28.png`
7556 /// to make it easier for skins to work with custom icon sets\, it now will return the filename only
7557 /// i.e. 28.png
7558 /// @skinning_v13 **[Infolabel Updated]** \link Window_Weather_Property `Window(Weather).Property(property)`\endlink
7559 /// added `WeatherProviderLogo` property - weather provider logo (for weather addons that support it).
7560 /// <p>
7561 /// }
7562 /// \table_end
7564 /// -----------------------------------------------------------------------------
7565 const infomap window_bools[] = {{ "ismedia", WINDOW_IS_MEDIA },
7566 { "is", WINDOW_IS },
7567 { "isactive", WINDOW_IS_ACTIVE },
7568 { "isvisible", WINDOW_IS_VISIBLE },
7569 { "istopmost", WINDOW_IS_DIALOG_TOPMOST }, //! @deprecated, remove in v19
7570 { "isdialogtopmost", WINDOW_IS_DIALOG_TOPMOST },
7571 { "ismodaldialogtopmost", WINDOW_IS_MODAL_DIALOG_TOPMOST },
7572 { "previous", WINDOW_PREVIOUS },
7573 { "next", WINDOW_NEXT }};
7575 /// \page modules__infolabels_boolean_conditions
7576 /// \subsection modules__infolabels_boolean_conditions_Control Control
7577 /// \table_start
7578 /// \table_h3{ Labels, Type, Description }
7579 /// \table_row3{ <b>`Control.HasFocus(id)`</b>,
7580 /// \anchor Control_HasFocus
7581 /// _boolean_,
7582 /// @return **True** if the currently focused control has id "id".
7583 /// @param id - The id of the control
7584 /// <p>
7585 /// }
7586 /// \table_row3{ <b>`Control.IsVisible(id)`</b>,
7587 /// \anchor Control_IsVisible
7588 /// _boolean_,
7589 /// @return **True** if the control with id "id" is visible.
7590 /// @param id - The id of the control
7591 /// <p>
7592 /// }
7593 /// \table_row3{ <b>`Control.IsEnabled(id)`</b>,
7594 /// \anchor Control_IsEnabled
7595 /// _boolean_,
7596 /// @return **True** if the control with id "id" is enabled.
7597 /// @param id - The id of the control
7598 /// <p>
7599 /// }
7600 /// \table_row3{ <b>`Control.GetLabel(id)[.index()]`</b>,
7601 /// \anchor Control_GetLabel
7602 /// _string_,
7603 /// @return The label value or texture name of the control with the given id.
7604 /// @param id - The id of the control
7605 /// @param index - [opt] Optionally you can specify index(1) to retrieve label2 from an Edit
7606 /// control.
7607 /// <p><hr>
7608 /// @skinning_v15 **[Infolabel Updated]** \link Control_GetLabel `Control.GetLabel(id)`\endlink
7609 /// added index parameter - allows skinner to retrieve label2 of a control. Only edit controls are supported.
7610 /// ** Example** : `Control.GetLabel(999).index(1)` where:
7611 /// - index(0) = label
7612 /// - index(1) = label2
7613 /// <p>
7614 /// }
7615 /// \table_end
7617 /// -----------------------------------------------------------------------------
7618 const infomap control_labels[] = {{ "hasfocus", CONTROL_HAS_FOCUS },
7619 { "isvisible", CONTROL_IS_VISIBLE },
7620 { "isenabled", CONTROL_IS_ENABLED },
7621 { "getlabel", CONTROL_GET_LABEL }};
7623 /// \page modules__infolabels_boolean_conditions
7624 /// \subsection modules__infolabels_boolean_conditions_Playlist Playlist
7625 /// \table_start
7626 /// \table_h3{ Labels, Type, Description }
7627 /// \table_row3{ <b>`Playlist.Length(media)`</b>,
7628 /// \anchor Playlist_Length
7629 /// _integer_,
7630 /// @return The total size of the current playlist.
7631 /// @param media - [opt] mediatype with is either
7632 /// video or music.
7633 /// <p>
7634 /// }
7635 /// \table_row3{ <b>`Playlist.Position(media)`</b>,
7636 /// \anchor Playlist_Position
7637 /// _integer_,
7638 /// @return The position of the current item in the current playlist.
7639 /// @param media - [opt] mediatype with is either
7640 /// video or music.
7641 /// <p>
7642 /// }
7643 /// \table_row3{ <b>`Playlist.Random`</b>,
7644 /// \anchor Playlist_Random
7645 /// _integer_,
7646 /// @return String ID for the random mode:
7647 /// - **16041** (On)
7648 /// - **591** (Off)
7649 /// <p><hr>
7650 /// @skinning_v18 **[Infolabel Updated]** \link Playlist_Random `Playlist.Random`\endlink will
7651 /// now return **On/Off**
7652 /// <p>
7653 /// }
7654 /// \table_row3{ <b>`Playlist.Repeat`</b>,
7655 /// \anchor Playlist_Repeat
7656 /// _integer_,
7657 /// @return The String Id for the repeat mode. It can be one of the following
7658 /// values:
7659 /// - **592** (Repeat One)
7660 /// - **593** (Repeat All)
7661 /// - **594** (Repeat Off)
7662 /// <p>
7663 /// }
7664 /// \table_row3{ <b>`Playlist.IsRandom`</b>,
7665 /// \anchor Playlist_IsRandom
7666 /// _boolean_,
7667 /// @return **True** if the player is in random mode.
7668 /// <p>
7669 /// }
7670 /// \table_row3{ <b>`Playlist.IsRepeat`</b>,
7671 /// \anchor Playlist_IsRepeat
7672 /// _boolean_,
7673 /// @return **True** if the player is in repeat all mode.
7674 /// <p>
7675 /// }
7676 /// \table_row3{ <b>`Playlist.IsRepeatOne`</b>,
7677 /// \anchor Playlist_IsRepeatOne
7678 /// _boolean_,
7679 /// @return **True** if the player is in repeat one mode.
7680 /// <p>
7681 /// }
7682 /// \table_end
7684 /// -----------------------------------------------------------------------------
7685 const infomap playlist[] = {{ "length", PLAYLIST_LENGTH },
7686 { "position", PLAYLIST_POSITION },
7687 { "random", PLAYLIST_RANDOM },
7688 { "repeat", PLAYLIST_REPEAT },
7689 { "israndom", PLAYLIST_ISRANDOM },
7690 { "isrepeat", PLAYLIST_ISREPEAT },
7691 { "isrepeatone", PLAYLIST_ISREPEATONE }};
7693 /// \page modules__infolabels_boolean_conditions
7694 /// \subsection modules__infolabels_boolean_conditions_Pvr Pvr
7695 /// \table_start
7696 /// \table_h3{ Labels, Type, Description }
7697 /// \table_row3{ <b>`PVR.IsRecording`</b>,
7698 /// \anchor PVR_IsRecording
7699 /// _boolean_,
7700 /// @return **True** when the system is recording a tv or radio programme.
7701 /// <p>
7702 /// }
7703 /// \table_row3{ <b>`PVR.HasTimer`</b>,
7704 /// \anchor PVR_HasTimer
7705 /// _boolean_,
7706 /// @return **True** when a recording timer is active.
7707 /// <p>
7708 /// }
7709 /// \table_row3{ <b>`PVR.HasTVChannels`</b>,
7710 /// \anchor PVR_HasTVChannels
7711 /// _boolean_,
7712 /// @return **True** if there are TV channels available.
7713 /// <p>
7714 /// }
7715 /// \table_row3{ <b>`PVR.HasRadioChannels`</b>,
7716 /// \anchor PVR_HasRadioChannels
7717 /// _boolean_,
7718 /// @return **True** if there are radio channels available.
7719 /// <p>
7720 /// }
7721 /// \table_row3{ <b>`PVR.HasNonRecordingTimer`</b>,
7722 /// \anchor PVR_HasNonRecordingTimer
7723 /// _boolean_,
7724 /// @return **True** if there are timers present who currently not do recording.
7725 /// <p>
7726 /// }
7727 /// \table_row3{ <b>`PVR.BackendName`</b>,
7728 /// \anchor PVR_BackendName
7729 /// _string_,
7730 /// @return The name of the backend being used.
7731 /// <p>
7732 /// }
7733 /// \table_row3{ <b>`PVR.BackendVersion`</b>,
7734 /// \anchor PVR_BackendVersion
7735 /// _string_,
7736 /// @return The version of the backend that's being used.
7737 /// <p>
7738 /// }
7739 /// \table_row3{ <b>`PVR.BackendHost`</b>,
7740 /// \anchor PVR_BackendHost
7741 /// _string_,
7742 /// @return The backend hostname.
7743 /// <p>
7744 /// }
7745 /// \table_row3{ <b>`PVR.BackendDiskSpace`</b>,
7746 /// \anchor PVR_BackendDiskSpace
7747 /// _string_,
7748 /// @return The available diskspace on the backend as string with size.
7749 /// <p>
7750 /// }
7751 /// \table_row3{ <b>`PVR.BackendDiskSpaceProgr`</b>,
7752 /// \anchor PVR_BackendDiskSpaceProgr
7753 /// _integer_,
7754 /// @return The available diskspace on the backend as percent value.
7755 /// <p><hr>
7756 /// @skinning_v14 **[New Infolabel]** \link PVR_BackendDiskSpaceProgr `PVR.BackendDiskSpaceProgr`\endlink
7757 /// <p>
7758 /// }
7759 /// \table_row3{ <b>`PVR.BackendChannels`</b>,
7760 /// \anchor PVR_BackendChannels
7761 /// _string (integer)_,
7762 /// @return The number of available channels the backend provides.
7763 /// <p>
7764 /// }
7765 /// \table_row3{ <b>`PVR.BackendTimers`</b>,
7766 /// \anchor PVR_BackendTimers
7767 /// _string (integer)_,
7768 /// @return The number of timers set for the backend.
7769 /// <p>
7770 /// }
7771 /// \table_row3{ <b>`PVR.BackendRecordings`</b>,
7772 /// \anchor PVR_BackendRecordings
7773 /// _string (integer)_,
7774 /// @return The number of recordings available on the backend.
7775 /// <p>
7776 /// }
7777 /// \table_row3{ <b>`PVR.BackendDeletedRecordings`</b>,
7778 /// \anchor PVR_BackendDeletedRecordings
7779 /// _string (integer)_,
7780 /// @return The number of deleted recordings present on the backend.
7781 /// <p>
7782 /// }
7783 /// \table_row3{ <b>`PVR.BackendNumber`</b>,
7784 /// \anchor PVR_BackendNumber
7785 /// _string_,
7786 /// @return The backend number.
7787 /// <p>
7788 /// }
7789 /// \table_row3{ <b>`PVR.TotalDiscSpace`</b>,
7790 /// \anchor PVR_TotalDiscSpace
7791 /// _string_,
7792 /// @return The total diskspace available for recordings.
7793 /// <p>
7794 /// }
7795 /// \table_row3{ <b>`PVR.NextTimer`</b>,
7796 /// \anchor PVR_NextTimer
7797 /// _boolean_,
7798 /// @return The next timer date.
7799 /// <p>
7800 /// }
7801 /// \table_row3{ <b>`PVR.IsPlayingTV`</b>,
7802 /// \anchor PVR_IsPlayingTV
7803 /// _boolean_,
7804 /// @return **True** when live tv is being watched.
7805 /// <p>
7806 /// }
7807 /// \table_row3{ <b>`PVR.IsPlayingRadio`</b>,
7808 /// \anchor PVR_IsPlayingRadio
7809 /// _boolean_,
7810 /// @return **True** when live radio is being listened to.
7811 /// <p>
7812 /// }
7813 /// \table_row3{ <b>`PVR.IsPlayingRecording`</b>,
7814 /// \anchor PVR_IsPlayingRecording
7815 /// _boolean_,
7816 /// @return **True** when a recording is being watched.
7817 /// <p>
7818 /// }
7819 /// \table_row3{ <b>`PVR.IsPlayingEpgTag`</b>,
7820 /// \anchor PVR_IsPlayingEpgTag
7821 /// _boolean_,
7822 /// @return **True** when an epg tag is being watched.
7823 /// <p>
7824 /// }
7825 /// \table_row3{ <b>`PVR.EpgEventProgress`</b>,
7826 /// \anchor PVR_EpgEventProgress
7827 /// _integer_,
7828 /// @return The percentage complete of the currently playing epg event.
7829 /// <p><hr>
7830 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventProgress `PVR.EpgEventProgress`\endlink replaces
7831 /// the old `PVR.Progress` infolabel.
7832 /// <p>
7833 /// }
7834 /// \table_row3{ <b>`PVR.ActStreamClient`</b>,
7835 /// \anchor PVR_ActStreamClient
7836 /// _string_,
7837 /// @return The stream client name.
7838 /// <p>
7839 /// }
7840 /// \table_row3{ <b>`PVR.ActStreamDevice`</b>,
7841 /// \anchor PVR_ActStreamDevice
7842 /// _string_,
7843 /// @return The stream device name.
7844 /// <p>
7845 /// }
7846 /// \table_row3{ <b>`PVR.ActStreamStatus`</b>,
7847 /// \anchor PVR_ActStreamStatus
7848 /// _string_,
7849 /// @return The status of the stream.
7850 /// <p>
7851 /// }
7852 /// \table_row3{ <b>`PVR.ActStreamSignal`</b>,
7853 /// \anchor PVR_ActStreamSignal
7854 /// _string_,
7855 /// @return The signal quality of the stream.
7856 /// <p>
7857 /// }
7858 /// \table_row3{ <b>`PVR.ActStreamSnr`</b>,
7859 /// \anchor PVR_ActStreamSnr
7860 /// _string_,
7861 /// @return The signal to noise ratio of the stream.
7862 /// <p>
7863 /// }
7864 /// \table_row3{ <b>`PVR.ActStreamBer`</b>,
7865 /// \anchor PVR_ActStreamBer
7866 /// _string_,
7867 /// @return The bit error rate of the stream.
7868 /// <p>
7869 /// }
7870 /// \table_row3{ <b>`PVR.ActStreamUnc`</b>,
7871 /// \anchor PVR_ActStreamUnc
7872 /// _string_,
7873 /// @return The UNC value of the stream.
7874 /// <p>
7875 /// }
7876 /// \table_row3{ <b>`PVR.ActStreamProgrSignal`</b>,
7877 /// \anchor PVR_ActStreamProgrSignal
7878 /// _integer_,
7879 /// @return The signal quality of the programme.
7880 /// <p>
7881 /// }
7882 /// \table_row3{ <b>`PVR.ActStreamProgrSnr`</b>,
7883 /// \anchor PVR_ActStreamProgrSnr
7884 /// _integer_,
7885 /// @return The signal to noise ratio of the programme.
7886 /// <p>
7887 /// }
7888 /// \table_row3{ <b>`PVR.ActStreamIsEncrypted`</b>,
7889 /// \anchor PVR_ActStreamIsEncrypted
7890 /// _boolean_,
7891 /// @return **True** when channel is encrypted on source.
7892 /// <p>
7893 /// }
7894 /// \table_row3{ <b>`PVR.ActStreamEncryptionName`</b>,
7895 /// \anchor PVR_ActStreamEncryptionName
7896 /// _string_,
7897 /// @return The encryption used on the stream.
7898 /// <p>
7899 /// }
7900 /// \table_row3{ <b>`PVR.ActStreamServiceName`</b>,
7901 /// \anchor PVR_ActStreamServiceName
7902 /// _string_,
7903 /// @return The service name of played channel if available.
7904 /// <p>
7905 /// }
7906 /// \table_row3{ <b>`PVR.ActStreamMux`</b>,
7907 /// \anchor PVR_ActStreamMux
7908 /// _string_,
7909 /// @return The multiplex type of played channel if available.
7910 /// <p>
7911 /// }
7912 /// \table_row3{ <b>`PVR.ActStreamProviderName`</b>,
7913 /// \anchor PVR_ActStreamProviderName
7914 /// _string_,
7915 /// @return The provider name of the played channel if available.
7916 /// <p>
7917 /// }
7918 /// \table_row3{ <b>`PVR.IsTimeShift`</b>,
7919 /// \anchor PVR_IsTimeShift
7920 /// _boolean_,
7921 /// @return **True** when for channel is timeshift available.
7922 /// <p>
7923 /// }
7924 /// \table_row3{ <b>`PVR.TimeShiftProgress`</b>,
7925 /// \anchor PVR_TimeShiftProgress
7926 /// _integer_,
7927 /// @return The position of currently timeshifted title on TV as integer.
7928 /// <p>
7929 /// }
7930 /// \table_row3{ <b>`PVR.TimeShiftSeekbar`</b>,
7931 /// \anchor PVR_TimeShiftSeekbar
7932 /// _integer_,
7933 /// @return The percentage we are seeking to in a timeshifted title.
7934 /// <p><hr>
7935 /// @skinning_v19 **[New Infolabel]** \link PVR_TimeShiftSeekbar `PVR.TimeShiftSeekbar`\endlink
7936 /// <p>
7937 /// }
7938 /// \table_row3{ <b>`PVR.NowRecordingTitle`</b>,
7939 /// \anchor PVR_NowRecordingTitle
7940 /// _string_,
7941 /// @return The title of the programme being recorded.
7942 /// <p>
7943 /// }
7944 /// \table_row3{ <b>`PVR.NowRecordingDateTime`</b>,
7945 /// \anchor PVR_NowRecordingDateTime
7946 /// _Date/Time string_,
7947 /// @return The start date and time of the current recording.
7948 /// <p>
7949 /// }
7950 /// \table_row3{ <b>`PVR.NowRecordingChannel`</b>,
7951 /// \anchor PVR_NowRecordingChannel
7952 /// _string_,
7953 /// @return The channel name of the current recording.
7954 /// <p>
7955 /// }
7956 /// \table_row3{ <b>`PVR.NowRecordingChannelIcon`</b>,
7957 /// \anchor PVR_NowRecordingChannelIcon
7958 /// _string_,
7959 /// @return The icon of the current recording channel.
7960 /// <p>
7961 /// }
7962 /// \table_row3{ <b>`PVR.NextRecordingTitle`</b>,
7963 /// \anchor PVR_NextRecordingTitle
7964 /// _string_,
7965 /// @return The title of the next programme that will be recorded.
7966 /// <p>
7967 /// }
7968 /// \table_row3{ <b>`PVR.NextRecordingDateTime`</b>,
7969 /// \anchor PVR_NextRecordingDateTime
7970 /// _Date/Time string_,
7971 /// @return The start date and time of the next recording.
7972 /// <p>
7973 /// }
7974 /// \table_row3{ <b>`PVR.NextRecordingChannel`</b>,
7975 /// \anchor PVR_NextRecordingChannel
7976 /// _string_,
7977 /// @return The channel name of the next recording.
7978 /// <p>
7979 /// }
7980 /// \table_row3{ <b>`PVR.NextRecordingChannelIcon`</b>,
7981 /// \anchor PVR_NextRecordingChannelIcon
7982 /// _string_,
7983 /// @return The icon of the next recording channel.
7984 /// <p>
7985 /// }
7986 /// \table_row3{ <b>`PVR.TVNowRecordingTitle`</b>,
7987 /// \anchor PVR_TVNowRecordingTitle
7988 /// _string_,
7989 /// @return The title of the tv programme being recorded.
7990 /// <p><hr>
7991 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingTitle `PVR.TVNowRecordingTitle`\endlink
7992 /// <p>
7993 /// }
7994 /// \table_row3{ <b>`PVR.TVNowRecordingDateTime`</b>,
7995 /// \anchor PVR_TVNowRecordingDateTime
7996 /// _Date/Time string_,
7997 /// @return The start date and time of the current tv recording.
7998 /// <p><hr>
7999 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingDateTime `PVR.TVNowRecordingDateTime`\endlink
8000 /// <p>
8001 /// }
8002 /// \table_row3{ <b>`PVR.TVNowRecordingChannel`</b>,
8003 /// \anchor PVR_TVNowRecordingChannel
8004 /// _string_,
8005 /// @return The channel name of the current tv recording.
8006 /// <p><hr>
8007 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannel `PVR.TVNowRecordingChannel`\endlink
8008 /// <p>
8009 /// }
8010 /// \table_row3{ <b>`PVR.TVNowRecordingChannelIcon`</b>,
8011 /// \anchor PVR_TVNowRecordingChannelIcon
8012 /// _string_,
8013 /// @return The icon of the current recording TV channel.
8014 /// <p><hr>
8015 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannelIcon `PVR.TVNowRecordingChannelIcon`\endlink
8016 /// <p>
8017 /// }
8018 /// \table_row3{ <b>`PVR.TVNextRecordingTitle`</b>,
8019 /// \anchor PVR_TVNextRecordingTitle
8020 /// _string_,
8021 /// @return The title of the next tv programme that will be recorded.
8022 /// <p><hr>
8023 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingTitle `PVR.TVNextRecordingTitle`\endlink
8024 /// <p>
8025 /// }
8026 /// \table_row3{ <b>`PVR.TVNextRecordingDateTime`</b>,
8027 /// \anchor PVR_TVNextRecordingDateTime
8028 /// _Date/Time string_,
8029 /// @return The start date and time of the next tv recording.
8030 /// <p><hr>
8031 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingDateTime `PVR.TVNextRecordingDateTime`\endlink
8032 /// <p>
8033 /// }
8034 /// \table_row3{ <b>`PVR.TVNextRecordingChannel`</b>,
8035 /// \anchor PVR_TVNextRecordingChannel
8036 /// _string_,
8037 /// @return The channel name of the next tv recording.
8038 /// <p><hr>
8039 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannel `PVR.TVNextRecordingChannel`\endlink
8040 /// <p>
8041 /// }
8042 /// \table_row3{ <b>`PVR.TVNextRecordingChannelIcon`</b>,
8043 /// \anchor PVR_TVNextRecordingChannelIcon
8044 /// _string_,
8045 /// @return The icon of the next recording tv channel.
8046 /// <p><hr>
8047 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannelIcon `PVR.TVNextRecordingChannelIcon`\endlink
8048 /// <p>
8049 /// }
8050 /// \table_row3{ <b>`PVR.RadioNowRecordingTitle`</b>,
8051 /// \anchor PVR_RadioNowRecordingTitle
8052 /// _string_,
8053 /// @return The title of the radio programme being recorded.
8054 /// <p><hr>
8055 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingTitle `PVR.RadioNowRecordingTitle`\endlink
8056 /// <p>
8057 /// }
8058 /// \table_row3{ <b>`PVR.RadioNowRecordingDateTime`</b>,
8059 /// \anchor PVR_RadioNowRecordingDateTime
8060 /// _Date/Time string_,
8061 /// @return The start date and time of the current radio recording.
8062 /// <p><hr>
8063 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingDateTime `PVR.RadioNowRecordingDateTime`\endlink
8064 /// <p>
8065 /// }
8066 /// \table_row3{ <b>`PVR.RadioNowRecordingChannel`</b>,
8067 /// \anchor PVR_RadioNowRecordingChannel
8068 /// _string_,
8069 /// @return The channel name of the current radio recording.
8070 /// <p><hr>
8071 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannel `PVR.RadioNowRecordingChannel`\endlink
8072 /// <p>
8073 /// }
8074 /// \table_row3{ <b>`PVR.RadioNowRecordingChannelIcon`</b>,
8075 /// \anchor PVR_RadioNowRecordingChannelIcon
8076 /// _string_,
8077 /// @return The icon of the current recording radio channel.
8078 /// <p><hr>
8079 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannelIcon `PVR.RadioNowRecordingChannelIcon`\endlink
8080 /// <p>
8081 /// }
8082 /// \table_row3{ <b>`PVR.RadioNextRecordingTitle`</b>,
8083 /// \anchor PVR_RadioNextRecordingTitle
8084 /// _string_,
8085 /// @return The title of the next radio programme that will be recorded.
8086 /// <p><hr>
8087 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingTitle `PVR.RadioNextRecordingTitle`\endlink
8088 /// <p>
8089 /// }
8090 /// \table_row3{ <b>`PVR.RadioNextRecordingDateTime`</b>,
8091 /// \anchor PVR_RadioNextRecordingDateTime
8092 /// _Date/Time string_,
8093 /// @return The start date and time of the next radio recording.
8094 /// <p><hr>
8095 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingDateTime `PVR.RadioNextRecordingDateTime`\endlink
8096 /// <p>
8097 /// }
8098 /// \table_row3{ <b>`PVR.RadioNextRecordingChannel`</b>,
8099 /// \anchor PVR_RadioNextRecordingChannel
8100 /// _string_,
8101 /// @return The channel name of the next radio recording.
8102 /// <p><hr>
8103 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannel `PVR.RadioNextRecordingChannel`\endlink
8104 /// <p>
8105 /// }
8106 /// \table_row3{ <b>`PVR.RadioNextRecordingChannelIcon`</b>,
8107 /// \anchor PVR_RadioNextRecordingChannelIcon
8108 /// _string_,
8109 /// @return The icon of the next recording radio channel.
8110 /// <p><hr>
8111 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannelIcon `PVR.RadioNextRecordingChannelIcon`\endlink
8112 /// <p>
8113 /// }
8114 /// \table_row3{ <b>`PVR.IsRecordingTV`</b>,
8115 /// \anchor PVR_IsRecordingTV
8116 /// _boolean_,
8117 /// @return **True** when the system is recording a tv programme.
8118 /// <p><hr>
8119 /// @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingTV `PVR.IsRecordingTV`\endlink
8120 /// <p>
8121 /// }
8122 /// \table_row3{ <b>`PVR.HasTVTimer`</b>,
8123 /// \anchor PVR_HasTVTimer
8124 /// _boolean_,
8125 /// @return **True** if at least one tv timer is active.
8126 /// <p><hr>
8127 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasTVTimer `PVR.HasTVTimer`\endlink
8128 /// <p>
8129 /// }
8130 /// \table_row3{ <b>`PVR.HasNonRecordingTVTimer`</b>,
8131 /// \anchor PVR_HasNonRecordingTVTimer
8132 /// _boolean_,
8133 /// @return **True** if there are tv timers present who currently not do recording.
8134 /// <p><hr>
8135 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingTVTimer `PVR.HasNonRecordingTVTimer`\endlink
8136 /// <p>
8137 /// }
8138 /// \table_row3{ <b>`PVR.IsRecordingRadio`</b>,
8139 /// \anchor PVR_IsRecordingRadio
8140 /// _boolean_,
8141 /// @return **True** when the system is recording a radio programme.
8142 /// <p><hr>
8143 /// @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingRadio `PVR.IsRecordingRadio`\endlink
8144 /// <p>
8145 /// }
8146 /// \table_row3{ <b>`PVR.HasRadioTimer`</b>,
8147 /// \anchor PVR_HasRadioTimer
8148 /// _boolean_,
8149 /// @return **True** if at least one radio timer is active.
8150 /// <p><hr>
8151 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasRadioTimer `PVR.HasRadioTimer`\endlink
8152 /// <p>
8153 /// }
8154 /// \table_row3{ <b>`PVR.HasNonRecordingRadioTimer`</b>,
8155 /// \anchor PVR_HasNonRecordingRadioTimer
8156 /// _boolean_,
8157 /// @return **True** if there are radio timers present who currently not do recording.
8158 /// <p><hr>
8159 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingRadioTimer `PVR.HasRadioTimer`\endlink
8160 /// <p>
8161 /// }
8162 /// \table_row3{ <b>`PVR.ChannelNumberInput`</b>,
8163 /// \anchor PVR_ChannelNumberInput
8164 /// _string_,
8165 /// @return The currently entered channel number while in numeric channel input mode\, an empty string otherwise.
8166 /// <p><hr>
8167 /// @skinning_v18 **[New Infolabel]** \link PVR_ChannelNumberInput `PVR.ChannelNumberInput`\endlink
8168 /// <p>
8169 /// }
8170 /// \table_row3{ <b>`PVR.CanRecordPlayingChannel`</b>,
8171 /// \anchor PVR_CanRecordPlayingChannel
8172 /// _boolean_,
8173 /// @return **True** if PVR is currently playing a channel and if this channel can be recorded.
8174 /// <p><hr>
8175 /// @skinning_v18 **[Infolabel Updated]** \link PVR_CanRecordPlayingChannel `PVR.CanRecordPlayingChannel`\endlink replaces
8176 /// the old `Player.CanRecord` infolabel.
8177 /// <p>
8178 /// }
8179 /// \table_row3{ <b>`PVR.IsRecordingPlayingChannel`</b>,
8180 /// \anchor PVR_IsRecordingPlayingChannel
8181 /// _boolean_,
8182 /// @return **True** if PVR is currently playing a channel and if this channel is currently recorded.
8183 /// <p><hr>
8184 /// @skinning_v18 **[Infolabel Updated]** \link PVR_IsRecordingPlayingChannel `PVR.IsRecordingPlayingChannel`\endlink replaces
8185 /// the old `Player.Recording` infolabel.
8186 /// <p>
8187 /// }
8188 /// \table_row3{ <b>`PVR.IsPlayingActiveRecording`</b>,
8189 /// \anchor PVR_IsPlayingActiveRecording
8190 /// _boolean_,
8191 /// @return **True** if PVR is currently playing an in progress recording.
8192 /// <p><hr>
8193 /// @skinning_v19 **[New Infolabel]** \link PVR_IsPlayingActiveRecording `PVR.IsPlayingActiveRecording`\endlink
8194 /// <p>
8195 /// }
8196 /// \table_row3{ <b>`PVR.TimeshiftProgressPlayPos`</b>,
8197 /// \anchor PVR_TimeshiftProgressPlayPos
8198 /// _integer_,
8199 /// @return The percentage of the current play position within the PVR timeshift progress.
8200 /// <p><hr>
8201 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressPlayPos `PVR.TimeshiftProgressPlayPos`\endlink
8202 /// <p>
8203 /// }
8204 /// \table_row3{ <b>`PVR.TimeshiftProgressEpgStart`</b>,
8205 /// \anchor PVR_TimeshiftProgressEpgStart
8206 /// _integer_,
8207 /// @return The percentage of the start of the currently playing epg event within the PVR timeshift progress.
8208 /// <p><hr>
8209 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgStart `PVR.TimeshiftProgressEpgStart`\endlink
8210 /// <p>
8211 /// }
8212 /// \table_row3{ <b>`PVR.TimeshiftProgressEpgEnd`</b>,
8213 /// \anchor PVR_TimeshiftProgressEpgEnd
8214 /// _integer_,
8215 /// @return The percentage of the end of the currently playing epg event within the PVR timeshift progress.
8216 /// <p><hr>
8217 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgEnd `PVR.TimeshiftProgressEpgEnd`\endlink
8218 /// <p>
8219 /// }
8220 /// \table_row3{ <b>`PVR.TimeshiftProgressBufferStart`</b>,
8221 /// \anchor PVR_TimeshiftProgressBufferStart
8222 /// _integer_,
8223 /// @return The percentage of the start of the timeshift buffer within the PVR timeshift progress.
8224 /// <p><hr>
8225 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferStart `PVR.TimeshiftProgressBufferStart`\endlink
8226 /// <p>
8227 /// }
8228 /// \table_row3{ <b>`PVR.TimeshiftProgressBufferEnd`</b>,
8229 /// \anchor PVR_TimeshiftProgressBufferEnd
8230 /// _integer_,
8231 /// @return The percentage of the end of the timeshift buffer within the PVR timeshift progress.
8232 /// <p><hr>
8233 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferEnd `PVR.TimeshiftProgressBufferEnd`\endlink
8234 /// <p>
8235 /// }
8236 /// \table_row3{ <b>`PVR.EpgEventIcon`</b>,
8237 /// \anchor PVR_EpgEventIcon
8238 /// _string_,
8239 /// @return The icon of the currently playing epg event\, if any.
8240 /// <p><hr>
8241 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventIcon `PVR.EpgEventIcon`\endlink
8242 /// <p>
8243 /// }
8244 /// \table_row3{ <b>`PVR.ClientCount`</b>,
8245 /// \anchor PVR_ClientCount
8246 /// _integer_,
8247 /// @return Number of PVR clients enabled.
8248 /// <p><hr>
8249 /// @skinning_v22 **[New Integer Value]** \link PVR_ClientCount `PVR.ClientCount`\endlink
8250 /// <p>
8251 /// }
8252 /// \table_end
8254 /// -----------------------------------------------------------------------------
8255 // clang-format off
8256 const infomap pvr[] = {{ "isrecording", PVR_IS_RECORDING },
8257 { "hastimer", PVR_HAS_TIMER },
8258 { "hastvchannels", PVR_HAS_TV_CHANNELS },
8259 { "hasradiochannels", PVR_HAS_RADIO_CHANNELS },
8260 { "hasnonrecordingtimer", PVR_HAS_NONRECORDING_TIMER },
8261 { "backendname", PVR_BACKEND_NAME },
8262 { "backendversion", PVR_BACKEND_VERSION },
8263 { "backendhost", PVR_BACKEND_HOST },
8264 { "backenddiskspace", PVR_BACKEND_DISKSPACE },
8265 { "backenddiskspaceprogr", PVR_BACKEND_DISKSPACE_PROGR },
8266 { "backendchannels", PVR_BACKEND_CHANNELS },
8267 { "backendtimers", PVR_BACKEND_TIMERS },
8268 { "backendrecordings", PVR_BACKEND_RECORDINGS },
8269 { "backenddeletedrecordings", PVR_BACKEND_DELETED_RECORDINGS },
8270 { "backendnumber", PVR_BACKEND_NUMBER },
8271 { "totaldiscspace", PVR_TOTAL_DISKSPACE },
8272 { "nexttimer", PVR_NEXT_TIMER },
8273 { "isplayingtv", PVR_IS_PLAYING_TV },
8274 { "isplayingradio", PVR_IS_PLAYING_RADIO },
8275 { "isplayingrecording", PVR_IS_PLAYING_RECORDING },
8276 { "isplayingepgtag", PVR_IS_PLAYING_EPGTAG },
8277 { "epgeventprogress", PVR_EPG_EVENT_PROGRESS },
8278 { "actstreamclient", PVR_ACTUAL_STREAM_CLIENT },
8279 { "actstreamdevice", PVR_ACTUAL_STREAM_DEVICE },
8280 { "actstreamstatus", PVR_ACTUAL_STREAM_STATUS },
8281 { "actstreamsignal", PVR_ACTUAL_STREAM_SIG },
8282 { "actstreamsnr", PVR_ACTUAL_STREAM_SNR },
8283 { "actstreamber", PVR_ACTUAL_STREAM_BER },
8284 { "actstreamunc", PVR_ACTUAL_STREAM_UNC },
8285 { "actstreamprogrsignal", PVR_ACTUAL_STREAM_SIG_PROGR },
8286 { "actstreamprogrsnr", PVR_ACTUAL_STREAM_SNR_PROGR },
8287 { "actstreamisencrypted", PVR_ACTUAL_STREAM_ENCRYPTED },
8288 { "actstreamencryptionname", PVR_ACTUAL_STREAM_CRYPTION },
8289 { "actstreamservicename", PVR_ACTUAL_STREAM_SERVICE },
8290 { "actstreammux", PVR_ACTUAL_STREAM_MUX },
8291 { "actstreamprovidername", PVR_ACTUAL_STREAM_PROVIDER },
8292 { "istimeshift", PVR_IS_TIMESHIFTING },
8293 { "timeshiftprogress", PVR_TIMESHIFT_PROGRESS },
8294 { "timeshiftseekbar", PVR_TIMESHIFT_SEEKBAR },
8295 { "nowrecordingtitle", PVR_NOW_RECORDING_TITLE },
8296 { "nowrecordingdatetime", PVR_NOW_RECORDING_DATETIME },
8297 { "nowrecordingchannel", PVR_NOW_RECORDING_CHANNEL },
8298 { "nowrecordingchannelicon", PVR_NOW_RECORDING_CHAN_ICO },
8299 { "nextrecordingtitle", PVR_NEXT_RECORDING_TITLE },
8300 { "nextrecordingdatetime", PVR_NEXT_RECORDING_DATETIME },
8301 { "nextrecordingchannel", PVR_NEXT_RECORDING_CHANNEL },
8302 { "nextrecordingchannelicon", PVR_NEXT_RECORDING_CHAN_ICO },
8303 { "tvnowrecordingtitle", PVR_TV_NOW_RECORDING_TITLE },
8304 { "tvnowrecordingdatetime", PVR_TV_NOW_RECORDING_DATETIME },
8305 { "tvnowrecordingchannel", PVR_TV_NOW_RECORDING_CHANNEL },
8306 { "tvnowrecordingchannelicon", PVR_TV_NOW_RECORDING_CHAN_ICO },
8307 { "tvnextrecordingtitle", PVR_TV_NEXT_RECORDING_TITLE },
8308 { "tvnextrecordingdatetime", PVR_TV_NEXT_RECORDING_DATETIME },
8309 { "tvnextrecordingchannel", PVR_TV_NEXT_RECORDING_CHANNEL },
8310 { "tvnextrecordingchannelicon", PVR_TV_NEXT_RECORDING_CHAN_ICO },
8311 { "radionowrecordingtitle", PVR_RADIO_NOW_RECORDING_TITLE },
8312 { "radionowrecordingdatetime", PVR_RADIO_NOW_RECORDING_DATETIME },
8313 { "radionowrecordingchannel", PVR_RADIO_NOW_RECORDING_CHANNEL },
8314 { "radionowrecordingchannelicon", PVR_RADIO_NOW_RECORDING_CHAN_ICO },
8315 { "radionextrecordingtitle", PVR_RADIO_NEXT_RECORDING_TITLE },
8316 { "radionextrecordingdatetime", PVR_RADIO_NEXT_RECORDING_DATETIME },
8317 { "radionextrecordingchannel", PVR_RADIO_NEXT_RECORDING_CHANNEL },
8318 { "radionextrecordingchannelicon", PVR_RADIO_NEXT_RECORDING_CHAN_ICO },
8319 { "isrecordingtv", PVR_IS_RECORDING_TV },
8320 { "hastvtimer", PVR_HAS_TV_TIMER },
8321 { "hasnonrecordingtvtimer", PVR_HAS_NONRECORDING_TV_TIMER },
8322 { "isrecordingradio", PVR_IS_RECORDING_RADIO },
8323 { "hasradiotimer", PVR_HAS_RADIO_TIMER },
8324 { "hasnonrecordingradiotimer", PVR_HAS_NONRECORDING_RADIO_TIMER },
8325 { "channelnumberinput", PVR_CHANNEL_NUMBER_INPUT },
8326 { "canrecordplayingchannel", PVR_CAN_RECORD_PLAYING_CHANNEL },
8327 { "isrecordingplayingchannel", PVR_IS_RECORDING_PLAYING_CHANNEL },
8328 { "isplayingactiverecording", PVR_IS_PLAYING_ACTIVE_RECORDING },
8329 { "timeshiftprogressplaypos", PVR_TIMESHIFT_PROGRESS_PLAY_POS },
8330 { "timeshiftprogressepgstart", PVR_TIMESHIFT_PROGRESS_EPG_START },
8331 { "timeshiftprogressepgend", PVR_TIMESHIFT_PROGRESS_EPG_END },
8332 { "timeshiftprogressbufferstart", PVR_TIMESHIFT_PROGRESS_BUFFER_START },
8333 { "timeshiftprogressbufferend", PVR_TIMESHIFT_PROGRESS_BUFFER_END },
8334 { "epgeventicon", PVR_EPG_EVENT_ICON },
8335 { "clientcount", PVR_CLIENT_COUNT }};
8336 // clang-format on
8338 /// \page modules__infolabels_boolean_conditions
8339 /// \table_row3{ <b>`PVR.EpgEventDuration`</b>,
8340 /// \anchor PVR_EpgEventDuration
8341 /// _string_,
8342 /// @return The duration of the currently playing epg event in the
8343 /// format <b>hh:mm:ss</b>.
8344 /// @note <b>hh:</b> will be omitted if hours value is zero.
8345 /// <p><hr>
8346 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventDuration `PVR.EpgEventDuration`\endlink replaces
8347 /// the old `PVR.Duration` infolabel.
8348 /// <p>
8349 /// }
8350 /// \table_row3{ <b>`PVR.EpgEventDuration(format)`</b>,
8351 /// \anchor PVR_EpgEventDuration_format
8352 /// _string_,
8353 /// @return The duration of the currently playing EPG event in different formats.
8354 /// @param format [opt] The format of the return time value.
8355 /// See \ref TIME_FORMAT for the list of possible values.
8356 /// <p>
8357 /// }
8358 /// \table_row3{ <b>`PVR.EpgEventElapsedTime`</b>,
8359 /// \anchor PVR_EpgEventElapsedTime
8360 /// _string_,
8361 /// @return the time of the current position of the currently playing epg event in the
8362 /// format <b>hh:mm:ss</b>.
8363 /// @note <b>hh:</b> will be omitted if hours value is zero.
8364 /// <p><hr>
8365 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventElapsedTime `PVR.EpgEventElapsedTime`\endlink replaces
8366 /// the old `PVR.Time` infolabel.
8367 /// <p>
8368 /// }
8369 /// \table_row3{ <b>`PVR.EpgEventElapsedTime(format)`</b>,
8370 /// \anchor PVR_EpgEventElapsedTime_format
8371 /// _string_,
8372 /// @return The time of the current position of the currently playing epg event in different formats.
8373 /// @param format [opt] The format of the return time value.
8374 /// See \ref TIME_FORMAT for the list of possible values.
8375 /// <p>
8376 /// }
8377 /// \table_row3{ <b>`PVR.EpgEventRemainingTime`</b>,
8378 /// \anchor PVR_EpgEventRemainingTime
8379 /// _string_,
8380 /// @return The remaining time for currently playing epg event in the
8381 /// format <b>hh:mm:ss</b>.
8382 /// @note <b>hh:</b> will be omitted if hours value is zero.
8383 /// <p><hr>
8384 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventRemainingTime `PVR.EpgEventRemainingTime`\endlink
8385 /// <p>
8386 /// }
8387 /// \table_row3{ <b>`PVR.EpgEventRemainingTime(format)`</b>,
8388 /// \anchor PVR_EpgEventRemainingTime_format
8389 /// _string_,
8390 /// @return The remaining time for currently playing epg event in different formats.
8391 /// @param format [opt] The format of the return time value.
8392 /// See \ref TIME_FORMAT for the list of possible values.
8393 /// <p>
8394 /// }
8395 /// \table_row3{ <b>`PVR.EpgEventSeekTime`</b>,
8396 /// \anchor PVR_EpgEventSeekTime
8397 /// _string_,
8398 /// @return The time the user is seeking within the currently playing epg event in the
8399 /// format <b>hh:mm:ss</b>.
8400 /// @note <b>hh:</b> will be omitted if hours value is zero.
8401 /// <p><hr>
8402 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventSeekTime `PVR.EpgEventSeekTime`\endlink
8403 /// <p>
8404 /// }
8405 /// \table_row3{ <b>`PVR.EpgEventSeekTime(format)`</b>,
8406 /// \anchor PVR_EpgEventSeekTime_format
8407 /// _string_,
8408 /// @return The time the user is seeking within the currently playing epg event in different formats.
8409 /// @param format [opt] The format of the return time value.
8410 /// See \ref TIME_FORMAT for the list of possible values.
8411 /// <p>
8412 /// }
8413 /// \table_row3{ <b>`PVR.EpgEventFinishTime`</b>,
8414 /// \anchor PVR_EpgEventFinishTime
8415 /// _string_,
8416 /// @return The time the currently playing epg event will end in the
8417 /// format <b>hh:mm:ss</b>.
8418 /// @note <b>hh:</b> will be omitted if hours value is zero.
8419 /// <p><hr>
8420 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventFinishTime `PVR.EpgEventFinishTime`\endlink
8421 /// <p>
8422 /// }
8423 /// \table_row3{ <b>`PVR.EpgEventFinishTime(format)`</b>,
8424 /// \anchor PVR_EpgEventFinishTime_format
8425 /// _string_,
8426 /// Returns the time the currently playing epg event will end in different formats.
8427 /// @param format [opt] The format of the return time value.
8428 /// See \ref TIME_FORMAT for the list of possible values.
8429 /// <p>
8430 /// }
8431 /// \table_row3{ <b>`PVR.TimeShiftStart`</b>,
8432 /// \anchor PVR_TimeShiftStart
8433 /// _string_,
8434 /// @return The start time of the timeshift buffer in the
8435 /// format <b>hh:mm:ss</b>.
8436 /// @note <b>hh:</b> will be omitted if hours value is zero.
8437 /// <p>
8438 /// }
8439 /// \table_row3{ <b>`PVR.TimeShiftStart(format)`</b>,
8440 /// \anchor PVR_TimeShiftStart_format
8441 /// _string_,
8442 /// Returns the start time of the timeshift buffer in different formats.
8443 /// @param format [opt] The format of the return time value.
8444 /// See \ref TIME_FORMAT for the list of possible values.
8445 /// <p>
8446 /// }
8447 /// \table_row3{ <b>`PVR.TimeShiftEnd`</b>,
8448 /// \anchor PVR_TimeShiftEnd
8449 /// _string_,
8450 /// @return The end time of the timeshift buffer in the
8451 /// format <b>hh:mm:ss</b>.
8452 /// @note <b>hh:</b> will be omitted if hours value is zero.
8453 /// <p>
8454 /// }
8455 /// \table_row3{ <b>`PVR.TimeShiftEnd(format)`</b>,
8456 /// \anchor PVR_TimeShiftEnd_format
8457 /// _string_,
8458 /// @return The end time of the timeshift buffer in different formats.
8459 /// @param format [opt] The format of the return time value.
8460 /// See \ref TIME_FORMAT for the list of possible values.
8461 /// <p>
8462 /// }
8463 /// \table_row3{ <b>`PVR.TimeShiftCur`</b>,
8464 /// \anchor PVR_TimeShiftCur
8465 /// _string_,
8466 /// @return The current playback time within the timeshift buffer in the
8467 /// format <b>hh:mm:ss</b>.
8468 /// @note <b>hh:</b> will be omitted if hours value is zero.
8469 /// <p>
8470 /// }
8471 /// \table_row3{ <b>`PVR.TimeShiftCur(format)`</b>,
8472 /// \anchor PVR_TimeShiftCur_format
8473 /// _string_,
8474 /// Returns the current playback time within the timeshift buffer in different formats.
8475 /// @param format [opt] The format of the return time value.
8476 /// See \ref TIME_FORMAT for the list of possible values.
8477 /// <p>
8478 /// }
8479 /// \table_row3{ <b>`PVR.TimeShiftOffset`</b>,
8480 /// \anchor PVR_TimeShiftOffset
8481 /// _string_,
8482 /// @return The delta of timeshifted time to actual time in the
8483 /// format <b>hh:mm:ss</b>.
8484 /// @note <b>hh:</b> will be omitted if hours value is zero.
8485 /// <p>
8486 /// }
8487 /// \table_row3{ <b>`PVR.TimeShiftOffset(format)`</b>,
8488 /// \anchor PVR_TimeShiftOffset_format
8489 /// _string_,
8490 /// Returns the delta of timeshifted time to actual time in different formats.
8491 /// @param format [opt] The format of the return time value.
8492 /// See \ref TIME_FORMAT for the list of possible values.
8493 /// <p>
8494 /// }
8495 /// \table_row3{ <b>`PVR.TimeshiftProgressDuration`</b>,
8496 /// \anchor PVR_TimeshiftProgressDuration
8497 /// _string_,
8498 /// @return the duration of the PVR timeshift progress in the
8499 /// format <b>hh:mm:ss</b>.
8500 /// @note <b>hh:</b> will be omitted if hours value is zero.
8501 /// <p><hr>
8502 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressDuration `PVR.TimeshiftProgressDuration`\endlink
8503 /// <p>
8504 /// }
8505 /// \table_row3{ <b>`PVR.TimeshiftProgressDuration(format)`</b>,
8506 /// \anchor PVR_TimeshiftProgressDuration_format
8507 /// _string_,
8508 /// @return The duration of the PVR timeshift progress in different formats.
8509 /// @param format [opt] The format of the return time value.
8510 /// See \ref TIME_FORMAT for the list of possible values.
8511 /// <p>
8512 /// }
8513 /// \table_row3{ <b>`PVR.TimeshiftProgressStartTime`</b>,
8514 /// \anchor PVR_TimeshiftProgressStartTime
8515 /// _string_,
8516 /// @return The start time of the PVR timeshift progress in the
8517 /// format <b>hh:mm:ss</b>.
8518 /// @note <b>hh:</b> will be omitted if hours value is zero.
8519 /// <p><hr>
8520 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressStartTime `PVR.TimeshiftProgressStartTime`\endlink
8521 /// <p>
8522 /// }
8523 /// \table_row3{ <b>`PVR.TimeshiftProgressStartTime(format)`</b>,
8524 /// \anchor PVR_TimeshiftProgressStartTime_format
8525 /// _string_,
8526 /// @return The start time of the PVR timeshift progress in different formats.
8527 /// @param format [opt] The format of the return time value.
8528 /// See \ref TIME_FORMAT for the list of possible values.
8529 /// <p>
8530 /// }
8531 /// \table_row3{ <b>`PVR.TimeshiftProgressEndTime`</b>,
8532 /// \anchor PVR_TimeshiftProgressEndTime
8533 /// _string_,
8534 /// @return The end time of the PVR timeshift progress in the
8535 /// format <b>hh:mm:ss</b>.
8536 /// @note hh: will be omitted if hours value is zero.
8537 /// <p><hr>
8538 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEndTime `PVR.TimeshiftProgressEndTime`\endlink
8539 /// <p>
8540 /// }
8541 /// \table_row3{ <b>`PVR.TimeshiftProgressEndTime(format)`</b>,
8542 /// \anchor PVR_TimeshiftProgressEndTime_format
8543 /// _string_,
8544 /// @return The end time of the PVR timeshift progress in different formats.
8545 /// @param format [opt] The format of the return time value.
8546 /// See \ref TIME_FORMAT for the list of possible values.
8547 /// <p>
8548 /// }
8549 /// \table_end
8551 /// -----------------------------------------------------------------------------
8552 const infomap pvr_times[] = {{ "epgeventduration", PVR_EPG_EVENT_DURATION },
8553 { "epgeventelapsedtime", PVR_EPG_EVENT_ELAPSED_TIME },
8554 { "epgeventremainingtime", PVR_EPG_EVENT_REMAINING_TIME },
8555 { "epgeventfinishtime", PVR_EPG_EVENT_FINISH_TIME },
8556 { "epgeventseektime", PVR_EPG_EVENT_SEEK_TIME },
8557 { "timeshiftstart", PVR_TIMESHIFT_START_TIME },
8558 { "timeshiftend", PVR_TIMESHIFT_END_TIME },
8559 { "timeshiftcur", PVR_TIMESHIFT_PLAY_TIME },
8560 { "timeshiftoffset", PVR_TIMESHIFT_OFFSET },
8561 { "timeshiftprogressduration", PVR_TIMESHIFT_PROGRESS_DURATION },
8562 { "timeshiftprogressstarttime", PVR_TIMESHIFT_PROGRESS_START_TIME },
8563 { "timeshiftprogressendtime", PVR_TIMESHIFT_PROGRESS_END_TIME }};
8565 /// \page modules__infolabels_boolean_conditions
8566 /// \subsection modules__infolabels_boolean_conditions_RDS RDS
8567 /// @note Only supported if both the PVR backend and the Kodi client support RDS.
8569 /// \table_start
8570 /// \table_h3{ Labels, Type, Description }
8571 /// \table_row3{ <b>`RDS.HasRds`</b>,
8572 /// \anchor RDS_HasRds
8573 /// _boolean_,
8574 /// @return **True** if RDS is present.
8575 /// <p><hr>
8576 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRds `RDS.HasRds`\endlink
8577 /// <p>
8578 /// }
8579 /// \table_row3{ <b>`RDS.HasRadioText`</b>,
8580 /// \anchor RDS_HasRadioText
8581 /// _boolean_,
8582 /// @return **True** if RDS contains also RadioText.
8583 /// <p><hr>
8584 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioText `RDS.HasRadioText`\endlink
8585 /// <p>
8586 /// }
8587 /// \table_row3{ <b>`RDS.HasRadioTextPlus`</b>,
8588 /// \anchor RDS_HasRadioTextPlus
8589 /// _boolean_,
8590 /// @return **True** if RDS with RadioText contains also the plus information.
8591 /// <p><hr>
8592 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioTextPlus `RDS.HasRadioTextPlus`\endlink
8593 /// <p>
8594 /// }
8595 /// \table_row3{ <b>`RDS.HasHotline`</b>,
8596 /// \anchor RDS_HasHotline
8597 /// _boolean_,
8598 /// @return **True** if a hotline phone number is present.
8599 /// @note Only available on RadioText Plus
8600 /// <p><hr>
8601 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasHotline `RDS.HasHotline`\endlink
8602 /// <p>
8603 /// }
8604 /// \table_row3{ <b>`RDS.HasStudio`</b>,
8605 /// \anchor RDS_HasStudio
8606 /// _boolean_,
8607 /// @return **True** if a studio name is present.
8608 /// @note Only available on RadioText Plus
8609 /// <p><hr>
8610 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasStudio `RDS.HasStudio`\endlink
8611 /// <p>
8612 /// }
8613 /// \table_row3{ <b>`RDS.AudioLanguage`</b>,
8614 /// \anchor RDS_AudioLanguage
8615 /// _string_,
8616 /// @return The RDS reported audio language of the channel.
8617 /// <p><hr>
8618 /// @skinning_v16 **[New Infolabel]** \link RDS_AudioLanguage `RDS.AudioLanguage`\endlink
8619 /// <p>
8620 /// }
8621 /// \table_row3{ <b>`RDS.ChannelCountry`</b>,
8622 /// \anchor RDS_ChannelCountry
8623 /// _string_,
8624 /// @return The country where the radio channel is broadcasted.
8625 /// <p><hr>
8626 /// @skinning_v16 **[New Infolabel]** \link RDS_ChannelCountry `RDS.ChannelCountry`\endlink
8627 /// <p>
8628 /// }
8629 /// \table_row3{ <b>`RDS.GetLine(number)`</b>,
8630 /// \anchor RDS_GetLine
8631 /// _string_,
8632 /// @return The last sent RDS text messages on given number.
8633 /// @param number - given number for RDS\, 0 is the
8634 /// last and 4 rows are supported (0-3)
8635 /// <p><hr>
8636 /// @skinning_v16 **[New Infolabel]** \link RDS_GetLine `RDS.GetLine(number)`\endlink
8637 /// <p>
8638 /// }
8639 /// \table_row3{ <b>`RDS.Title`</b>,
8640 /// \anchor RDS_Title
8641 /// _string_,
8642 /// @return The title of item; e.g. track title of an album.
8643 /// @note Only available on RadioText Plus
8644 /// <p><hr>
8645 /// @skinning_v16 **[New Infolabel]** \link RDS_Title `RDS.Title`\endlink
8646 /// <p>
8647 /// }
8648 /// \table_row3{ <b>`RDS.Artist`</b>,
8649 /// \anchor RDS_Artist
8650 /// _string_,
8651 /// @return A person or band/collective generally considered responsible for the work.
8652 /// @note Only available on RadioText Plus
8653 /// <p><hr>
8654 /// @skinning_v16 **[New Infolabel]** \link RDS_Artist `RDS.Artist`\endlink
8655 /// <p>
8656 /// }
8657 /// \table_row3{ <b>`RDS.Band`</b>,
8658 /// \anchor RDS_Band
8659 /// _string_,
8660 /// @return The band/orchestra/musician.
8661 /// @note Only available on RadioText Plus
8662 /// <p><hr>
8663 /// @skinning_v16 **[New Infolabel]** \link RDS_Band `RDS.Band`\endlink
8664 /// <p>
8665 /// }
8666 /// \table_row3{ <b>`RDS.Composer`</b>,
8667 /// \anchor RDS_Composer
8668 /// _string_,
8669 /// @return The name of the original composer/author.
8670 /// @note Only available on RadioText Plus
8671 /// <p><hr>
8672 /// @skinning_v16 **[New Infolabel]** \link RDS_Composer `RDS.Composer`\endlink
8673 /// <p>
8674 /// }
8675 /// \table_row3{ <b>`RDS.Conductor`</b>,
8676 /// \anchor RDS_Conductor
8677 /// _string_,
8678 /// @return The artist(s) who performed the work. In classical music this would be
8679 /// the conductor.
8680 /// @note Only available on RadioText Plus
8681 /// <p><hr>
8682 /// @skinning_v16 **[New Infolabel]** \link RDS_Conductor `RDS.Conductor`\endlink
8683 /// <p>
8684 /// }
8685 /// \table_row3{ <b>`RDS.Album`</b>,
8686 /// \anchor RDS_Album
8687 /// _string_,
8688 /// @return The album of the song.
8689 /// @note Only available on RadioText Plus
8690 /// <p><hr>
8691 /// @skinning_v16 **[New Infolabel]** \link RDS_Album `RDS.Album`\endlink
8692 /// <p>
8693 /// }
8694 /// \table_row3{ <b>`RDS.TrackNumber`</b>,
8695 /// \anchor RDS_TrackNumber
8696 /// _string_,
8697 /// @return The track number of the item on the album on which it was originally
8698 /// released.
8699 /// @note Only be available on RadioText Plus
8700 /// <p><hr>
8701 /// @skinning_v16 **[New Infolabel]** \link RDS_TrackNumber `RDS.TrackNumber`\endlink
8702 /// <p>
8703 /// }
8704 /// \table_row3{ <b>`RDS.RadioStyle`</b>,
8705 /// \anchor RDS_RadioStyle
8706 /// _string_,
8707 /// @return The style of current played radio channel\, it is always
8708 /// updated once the style changes\, e.g "popmusic" to "news" or "weather"...
8709 /// | RDS | RBDS |
8710 /// |:------------------------|:------------------------|
8711 /// | none | none |
8712 /// | news | news |
8713 /// | currentaffairs | information |
8714 /// | information | sport |
8715 /// | sport | talk |
8716 /// | education | rockmusic |
8717 /// | drama | classicrockmusic |
8718 /// | cultures | adulthits |
8719 /// | science | softrock |
8720 /// | variedspeech | top40 |
8721 /// | popmusic | countrymusic |
8722 /// | rockmusic | oldiesmusic |
8723 /// | easylistening | softmusic |
8724 /// | lightclassics | nostalgia |
8725 /// | seriousclassics | jazzmusic |
8726 /// | othermusic | classical |
8727 /// | weather | randb |
8728 /// | finance | softrandb |
8729 /// | childrensprogs | language |
8730 /// | socialaffairs | religiousmusic |
8731 /// | religion | religioustalk |
8732 /// | phonein | personality |
8733 /// | travelandtouring | public |
8734 /// | leisureandhobby | college |
8735 /// | jazzmusic | spanishtalk |
8736 /// | countrymusic | spanishmusic |
8737 /// | nationalmusic | hiphop |
8738 /// | oldiesmusic | |
8739 /// | folkmusic | |
8740 /// | documentary | weather |
8741 /// | alarmtest | alarmtest |
8742 /// | alarm-alarm | alarm-alarm |
8743 /// @note "alarm-alarm" is normally not used from radio stations\, is thought
8744 /// to inform about horrible messages who are needed asap to all people.
8745 /// <p><hr>
8746 /// @skinning_v16 **[New Infolabel]** \link RDS_RadioStyle `RDS.RadioStyle`\endlink
8747 /// <p>
8748 /// }
8749 /// \table_row3{ <b>`RDS.Comment`</b>,
8750 /// \anchor RDS_Comment
8751 /// _string_,
8752 /// @return The radio station comment string if available.
8753 /// @note Only available on RadioText Plus
8754 /// <p><hr>
8755 /// @skinning_v16 **[New Infolabel]** \link RDS_Comment `RDS.Comment`\endlink
8756 /// <p>
8757 /// }
8758 /// \table_row3{ <b>`RDS.InfoNews`</b>,
8759 /// \anchor RDS_InfoNews
8760 /// _string_,
8761 /// @return The message / headline (if available).
8762 /// @note Only available on RadioText Plus
8763 /// <p><hr>
8764 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoNews `RDS.InfoNews`\endlink
8765 /// <p>
8766 /// }
8767 /// \table_row3{ <b>`RDS.InfoNewsLocal`</b>,
8768 /// \anchor RDS_InfoNewsLocal
8769 /// _string_,
8770 /// @return The local information news sended from radio channel (if available).
8771 /// @note Only available on RadioText Plus
8772 /// <p><hr>
8773 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoNewsLocal `RDS.InfoNewsLocal`\endlink
8774 /// <p>
8775 /// }
8776 /// \table_row3{ <b>`RDS.InfoStock`</b>,
8777 /// \anchor RDS_InfoStock
8778 /// _string_,
8779 /// @return The stock information; either as one part or as several distinct parts:
8780 /// "name 99latest value 99change 99high 99low 99volume" (if available).
8781 /// @note Only available on RadioText Plus
8782 /// <p><hr>
8783 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoStock `RDS.InfoStock`\endlink
8784 /// <p>
8785 /// }
8786 /// \table_row3{ <b>`RDS.InfoStockSize`</b>,
8787 /// \anchor RDS_InfoStockSize
8788 /// _string_,
8789 /// @return The number of rows present in stock information.
8790 /// @note Only available on RadioText Plus
8791 /// <p><hr>
8792 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoStockSize `RDS.InfoStockSize`\endlink
8793 /// <p>
8794 /// }
8795 /// \table_row3{ <b>`RDS.InfoSport`</b>,
8796 /// \anchor RDS_InfoSport
8797 /// _string_,
8798 /// @return The result of a match; either as one part or as several distinct parts:
8799 /// "match 99result"\, e.g. "Bayern München : Borussia 995:5" (if available).
8800 /// @note Only available on RadioText Plus
8801 /// <p><hr>
8802 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoSport `RDS.InfoSport`\endlink
8803 /// <p>
8804 /// }
8805 /// \table_row3{ <b>`RDS.InfoSportSize`</b>,
8806 /// \anchor RDS_InfoSportSize
8807 /// _string_,
8808 /// @return The number of rows present in sport information.
8809 /// @note Only available on RadioText Plus
8810 /// <p><hr>
8811 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoSportSize `RDS.InfoSportSize`\endlink
8812 /// <p>
8813 /// }
8814 /// \table_row3{ <b>`RDS.InfoLottery`</b>,
8815 /// \anchor RDS_InfoLottery
8816 /// _string_,
8817 /// @return The raffle / lottery: "key word 99values" (if available).
8818 /// @note Only available on RadioText Plus
8819 /// <p><hr>
8820 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoLottery `RDS.InfoLottery`\endlink
8821 /// <p>
8822 /// }
8823 /// \table_row3{ <b>`RDS.InfoLotterySize`</b>,
8824 /// \anchor RDS_InfoLotterySize
8825 /// _string_,
8826 /// @return The number of rows present in lottery information.
8827 /// @note Only available on RadioText Plus
8828 /// <p><hr>
8829 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoLotterySize `RDS.InfoLotterySize`\endlink
8830 /// <p>
8831 /// }
8832 /// \table_row3{ <b>`RDS.InfoWeather`</b>,
8833 /// \anchor RDS_InfoWeather
8834 /// _string_,
8835 /// @return The weather information (if available).
8836 /// @note Only available on RadioText Plus
8837 /// <p><hr>
8838 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoWeather `RDS.InfoWeather`\endlink
8839 /// <p>
8840 /// }
8841 /// \table_row3{ <b>`RDS.InfoWeatherSize`</b>,
8842 /// \anchor RDS_InfoWeatherSize
8843 /// _string_,
8844 /// @return The number of rows present in weather information.
8845 /// @note Only available on RadioText Plus
8846 /// <p><hr>
8847 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoWeatherSize `RDS.InfoWeatherSize`\endlink
8848 /// <p>
8849 /// }
8850 /// \table_row3{ <b>`RDS.InfoCinema`</b>,
8851 /// \anchor RDS_InfoCinema
8852 /// _string_,
8853 /// @return The information about movies in cinema (if available).
8854 /// @note Only available on RadioText Plus
8855 /// <p><hr>
8856 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoCinema `RDS.InfoCinema`\endlink
8857 /// <p>
8858 /// }
8859 /// \table_row3{ <b>`RDS.InfoCinemaSize`</b>,
8860 /// \anchor RDS_InfoCinemaSize
8861 /// _string_,
8862 /// @return The number of rows present in cinema information.
8863 /// @note Only available on RadioText Plus
8864 /// <p><hr>
8865 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoCinemaSize `RDS.InfoCinemaSize`\endlink
8866 /// <p>
8867 /// }
8868 /// \table_row3{ <b>`RDS.InfoHoroscope`</b>,
8869 /// \anchor RDS_InfoHoroscope
8870 /// _string_,
8871 /// @return The horoscope; either as one part or as two distinct parts:
8872 /// "key word 99text"\, e.g. "sign of the zodiac 99blablabla" (if available).
8873 /// @note Only available on RadioText Plus
8874 /// <p><hr>
8875 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscope `RDS.InfoHoroscope`\endlink
8876 /// <p>
8877 /// }
8878 /// \table_row3{ <b>`RDS.InfoHoroscopeSize`</b>,
8879 /// \anchor RDS_InfoHoroscopeSize
8880 /// _string_,
8881 /// @return The Number of rows present in horoscope information.
8882 /// @note Only available on RadioText Plus
8883 /// <p><hr>
8884 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscopeSize `RDS.InfoHoroscopeSize`\endlink
8885 /// <p>
8886 /// }
8887 /// \table_row3{ <b>`RDS.InfoOther`</b>,
8888 /// \anchor RDS_InfoOther
8889 /// _string_,
8890 /// @return Other information\, not especially specified: "key word 99info" (if available).
8891 /// @note Only available on RadioText Plus
8892 /// <p><hr>
8893 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoOther `RDS.InfoOther`\endlink
8894 /// <p>
8895 /// }
8896 /// \table_row3{ <b>`RDS.InfoOtherSize`</b>,
8897 /// \anchor RDS_InfoOtherSize
8898 /// _string_,
8899 /// @return The number of rows present with other information.
8900 /// @note Only available on RadioText Plus
8901 /// <p><hr>
8902 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoOtherSize `RDS.InfoOtherSize`\endlink
8903 /// <p>
8904 /// }
8905 /// \table_row3{ <b>`RDS.ProgStation`</b>,
8906 /// \anchor RDS_ProgStation
8907 /// _string_,
8908 /// @return The name of the radio channel.
8909 /// @note becomes also set from epg if it is not available from RDS
8910 /// <p><hr>
8911 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgStation `RDS.ProgStation`\endlink
8912 /// <p>
8913 /// }
8914 /// \table_row3{ <b>`RDS.ProgNow`</b>,
8915 /// \anchor RDS_ProgNow
8916 /// _string_,
8917 /// @return The now playing program name.
8918 /// @note becomes also be set from epg if from RDS not available
8919 /// <p><hr>
8920 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgNow `RDS.ProgNow`\endlink
8921 /// <p>
8922 /// }
8923 /// \table_row3{ <b>`RDS.ProgNext`</b>,
8924 /// \anchor RDS_ProgNext
8925 /// _string_,
8926 /// @return The next played program name (if available).
8927 /// @note becomes also be set from epg if from RDS not available
8928 /// <p><hr>
8929 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgNext `RDS.ProgNext`\endlink
8930 /// <p>
8931 /// }
8932 /// \table_row3{ <b>`RDS.ProgHost`</b>,
8933 /// \anchor RDS_ProgHost
8934 /// _string_,
8935 /// @return The name of the host of the radio show.
8936 /// <p><hr>
8937 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgHost `RDS.ProgHost`\endlink
8938 /// <p>
8939 /// }
8940 /// \table_row3{ <b>`RDS.ProgEditStaff`</b>,
8941 /// \anchor RDS_ProgEditStaff
8942 /// _string_,
8943 /// @return The name of the editorial staff; e.g. name of editorial journalist.
8944 /// @note Only available on RadioText Plus
8945 /// <p><hr>
8946 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgEditStaff `RDS.ProgEditStaff`\endlink
8947 /// <p>
8948 /// }
8949 /// \table_row3{ <b>`RDS.ProgHomepage`</b>,
8950 /// \anchor RDS_ProgHomepage
8951 /// _string_,
8952 /// @return The Link to radio station homepage
8953 /// @note Only available on RadioText Plus
8954 /// <p><hr>
8955 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgHomepage `RDS.ProgHomepage`\endlink
8956 /// <p>
8957 /// }
8958 /// \table_row3{ <b>`RDS.ProgStyle`</b>,
8959 /// \anchor RDS_ProgStyle
8960 /// _string_,
8961 /// @return A human readable string about radiostyle defined from RDS or RBDS.
8962 /// <p><hr>
8963 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgStyle `RDS.ProgStyle`\endlink
8964 /// <p>
8965 /// }
8966 /// \table_row3{ <b>`RDS.PhoneHotline`</b>,
8967 /// \anchor RDS_PhoneHotline
8968 /// _string_,
8969 /// @return The telephone number of the radio station's hotline.
8970 /// @note Only available on RadioText Plus
8971 /// <p><hr>
8972 /// @skinning_v16 **[New Infolabel]** \link RDS_PhoneHotline `RDS.PhoneHotline`\endlink
8973 /// <p>
8974 /// }
8975 /// \table_row3{ <b>`RDS.PhoneStudio`</b>,
8976 /// \anchor RDS_PhoneStudio
8977 /// _string_,
8978 /// @return The telephone number of the radio station's studio.
8979 /// @note Only available on RadioText Plus
8980 /// <p><hr>
8981 /// @skinning_v16 **[New Infolabel]** \link RDS_PhoneStudio `RDS.PhoneStudio`\endlink
8982 /// <p>
8983 /// }
8984 /// \table_row3{ <b>`RDS.SmsStudio`</b>,
8985 /// \anchor RDS_SmsStudio
8986 /// _string_,
8987 /// @return The sms number of the radio stations studio (to send directly a sms to
8988 /// the studio) (if available).
8989 /// @note Only available on RadioText Plus
8990 /// <p><hr>
8991 /// @skinning_v16 **[New Infolabel]** \link RDS_SmsStudio `RDS.SmsStudio`\endlink
8992 /// <p>
8993 /// }
8994 /// \table_row3{ <b>`RDS.EmailHotline`</b>,
8995 /// \anchor RDS_EmailHotline
8996 /// _string_,
8997 /// @return The email address of the radio stations hotline (if available).
8998 /// @note Only available on RadioText Plus
8999 /// <p><hr>
9000 /// @skinning_v16 **[New Infolabel]** \link RDS_EmailHotline `RDS.EmailHotline`\endlink
9001 /// <p>
9002 /// }
9003 /// \table_row3{ <b>`RDS.EmailStudio`</b>,
9004 /// \anchor RDS_EmailStudio
9005 /// _string_,
9006 /// @return The email address of the radio station's studio (if available).
9007 /// @note Only available on RadioText Plus
9008 /// <p><hr>
9009 /// @skinning_v16 **[New Infolabel]** \link RDS_EmailStudio `RDS.EmailStudio`\endlink
9010 /// <p>
9011 /// }
9012 /// \table_end
9014 /// -----------------------------------------------------------------------------
9015 const infomap rds[] = {{ "hasrds", RDS_HAS_RDS },
9016 { "hasradiotext", RDS_HAS_RADIOTEXT },
9017 { "hasradiotextplus", RDS_HAS_RADIOTEXT_PLUS },
9018 { "audiolanguage", RDS_AUDIO_LANG },
9019 { "channelcountry", RDS_CHANNEL_COUNTRY },
9020 { "title", RDS_TITLE },
9021 { "getline", RDS_GET_RADIOTEXT_LINE },
9022 { "artist", RDS_ARTIST },
9023 { "band", RDS_BAND },
9024 { "composer", RDS_COMPOSER },
9025 { "conductor", RDS_CONDUCTOR },
9026 { "album", RDS_ALBUM },
9027 { "tracknumber", RDS_ALBUM_TRACKNUMBER },
9028 { "radiostyle", RDS_GET_RADIO_STYLE },
9029 { "comment", RDS_COMMENT },
9030 { "infonews", RDS_INFO_NEWS },
9031 { "infonewslocal", RDS_INFO_NEWS_LOCAL },
9032 { "infostock", RDS_INFO_STOCK },
9033 { "infostocksize", RDS_INFO_STOCK_SIZE },
9034 { "infosport", RDS_INFO_SPORT },
9035 { "infosportsize", RDS_INFO_SPORT_SIZE },
9036 { "infolottery", RDS_INFO_LOTTERY },
9037 { "infolotterysize", RDS_INFO_LOTTERY_SIZE },
9038 { "infoweather", RDS_INFO_WEATHER },
9039 { "infoweathersize", RDS_INFO_WEATHER_SIZE },
9040 { "infocinema", RDS_INFO_CINEMA },
9041 { "infocinemasize", RDS_INFO_CINEMA_SIZE },
9042 { "infohoroscope", RDS_INFO_HOROSCOPE },
9043 { "infohoroscopesize", RDS_INFO_HOROSCOPE_SIZE },
9044 { "infoother", RDS_INFO_OTHER },
9045 { "infoothersize", RDS_INFO_OTHER_SIZE },
9046 { "progstation", RDS_PROG_STATION },
9047 { "prognow", RDS_PROG_NOW },
9048 { "prognext", RDS_PROG_NEXT },
9049 { "proghost", RDS_PROG_HOST },
9050 { "progeditstaff", RDS_PROG_EDIT_STAFF },
9051 { "proghomepage", RDS_PROG_HOMEPAGE },
9052 { "progstyle", RDS_PROG_STYLE },
9053 { "phonehotline", RDS_PHONE_HOTLINE },
9054 { "phonestudio", RDS_PHONE_STUDIO },
9055 { "smsstudio", RDS_SMS_STUDIO },
9056 { "emailhotline", RDS_EMAIL_HOTLINE },
9057 { "emailstudio", RDS_EMAIL_STUDIO },
9058 { "hashotline", RDS_HAS_HOTLINE_DATA },
9059 { "hasstudio", RDS_HAS_STUDIO_DATA }};
9061 /// \page modules__infolabels_boolean_conditions
9062 /// \subsection modules__infolabels_boolean_conditions_slideshow Slideshow
9063 /// \table_start
9064 /// \table_h3{ Labels, Type, Description }
9065 /// \table_row3{ <b>`Slideshow.IsActive`</b>,
9066 /// \anchor Slideshow_IsActive
9067 /// _boolean_,
9068 /// @return **True** if the picture slideshow is running.
9069 /// <p>
9070 /// }
9071 /// \table_row3{ <b>`Slideshow.IsPaused`</b>,
9072 /// \anchor Slideshow_IsPaused
9073 /// _boolean_,
9074 /// @return **True** if the picture slideshow is paused.
9075 /// <p>
9076 /// }
9077 /// \table_row3{ <b>`Slideshow.IsRandom`</b>,
9078 /// \anchor Slideshow_IsRandom
9079 /// _boolean_,
9080 /// @return **True** if the picture slideshow is in random mode.
9081 /// <p>
9082 /// }
9083 /// \table_row3{ <b>`Slideshow.IsVideo`</b>,
9084 /// \anchor Slideshow_IsVideo
9085 /// _boolean_,
9086 /// @return **True** if the picture slideshow is playing a video.
9087 /// <p><hr>
9088 /// @skinning_v13 **[New Boolean Condition]** \link Slideshow_IsVideo `Slideshow.IsVideo`\endlink
9089 /// <p>
9090 /// }
9091 /// \table_row3{ <b>`Slideshow.Altitude`</b>,
9092 /// \anchor Slideshow_Altitude
9093 /// _string_,
9094 /// @return The altitude in meters where the current picture was taken.
9095 /// @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
9096 /// <p>
9097 /// }
9098 /// \table_row3{ <b>`Slideshow.Aperture`</b>,
9099 /// \anchor Slideshow_Aperture
9100 /// _string_,
9101 /// @return The F-stop used to take the current picture.
9102 /// @note This is the value of the EXIF FNumber tag (hex code 0x829D).
9103 /// <p>
9104 /// }
9105 /// \table_row3{ <b>`Slideshow.Author`</b>,
9106 /// \anchor Slideshow_Author
9107 /// _string_,
9108 /// @return The name of the person involved in writing about the current
9109 /// picture.
9110 /// @note This is the value of the IPTC Writer tag (hex code 0x7A).
9111 /// <p><hr>
9112 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Author `Slideshow.Author`\endlink
9113 /// <p>
9114 /// }
9115 /// \table_row3{ <b>`Slideshow.Byline`</b>,
9116 /// \anchor Slideshow_Byline
9117 /// _string_,
9118 /// @return The name of the person who created the current picture.
9119 /// @note This is the value of the IPTC Byline tag (hex code 0x50).
9120 /// <p><hr>
9121 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Byline `Slideshow.Byline`\endlink
9122 /// <p>
9123 /// }
9124 /// \table_row3{ <b>`Slideshow.BylineTitle`</b>,
9125 /// \anchor Slideshow_BylineTitle
9126 /// _string_,
9127 /// @return The title of the person who created the current picture.
9128 /// @note This is the value of the IPTC BylineTitle tag (hex code 0x55).
9129 /// <p><hr>
9130 /// @skinning_v13 **[New Infolabel]** \link Slideshow_BylineTitle `Slideshow.BylineTitle`\endlink
9131 /// <p>
9132 /// }
9133 /// \table_row3{ <b>`Slideshow.CameraMake`</b>,
9134 /// \anchor Slideshow_CameraMake
9135 /// _string_,
9136 /// @return The manufacturer of the camera used to take the current picture.
9137 /// @note This is the value of the EXIF Make tag (hex code 0x010F).
9138 /// <p>
9139 /// }
9140 /// \table_row3{ <b>`Slideshow.CameraModel`</b>,
9141 /// \anchor Slideshow_CameraModel
9142 /// _string_,
9143 /// @return The manufacturer's model name or number of the camera used to take
9144 /// the current picture.
9145 /// @note This is the value of the EXIF Model tag (hex code 0x0110).
9146 /// <p>
9147 /// }
9148 /// \table_row3{ <b>`Slideshow.Caption`</b>,
9149 /// \anchor Slideshow_Caption
9150 /// _string_,
9151 /// @return A description of the current picture.
9152 /// @note This is the value of the IPTC Caption tag (hex code 0x78).
9153 /// <p>
9154 /// }
9155 /// \table_row3{ <b>`Slideshow.Category`</b>,
9156 /// \anchor Slideshow_Category
9157 /// _string_,
9158 /// @return The subject of the current picture as a category code.
9159 /// @note This is the value of the IPTC Category tag (hex code 0x0F).
9160 /// <p><hr>
9161 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Category `Slideshow.Category`\endlink
9162 /// <p>
9163 /// }
9164 /// \table_row3{ <b>`Slideshow.CCDWidth`</b>,
9165 /// \anchor Slideshow_CCDWidth
9166 /// _string_,
9167 /// @return The width of the CCD in the camera used to take the current
9168 /// picture.
9169 /// @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
9170 /// <p><hr>
9171 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CCDWidth `Slideshow.CCDWidth`\endlink
9172 /// <p>
9173 /// }
9174 /// \table_row3{ <b>`Slideshow.City`</b>,
9175 /// \anchor Slideshow_City
9176 /// _string_,
9177 /// @return The city where the current picture was taken.
9178 /// @note This is the value of the IPTC City tag (hex code 0x5A).
9179 /// <p><hr>
9180 /// @skinning_v13 **[New Infolabel]** \link Slideshow_City `Slideshow.City`\endlink
9181 /// <p>
9182 /// }
9183 /// \table_row3{ <b>`Slideshow.Colour`</b>,
9184 /// \anchor Slideshow_Colour
9185 /// _string_,
9186 /// @return the colour of the picture. It can have one of the following values:
9187 /// - <b>"Colour"</b>
9188 /// - <b>"Black and White"</b>
9189 /// <p>
9190 /// @deprecated Slideshow_Colour `Slideshow.Colour`\endlink is deprecated and will be removed in future Kodi versions
9191 /// <p><hr>
9192 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Colour `Slideshow.Colour`\endlink
9193 /// <p>
9194 /// }
9195 /// \table_row3{ <b>`Slideshow.CopyrightNotice`</b>,
9196 /// \anchor Slideshow_CopyrightNotice
9197 /// _string_,
9198 /// @return The copyright notice of the current picture.
9199 /// @note This is the value of the IPTC Copyright tag (hex code 0x74).
9200 /// <p><hr>
9201 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CopyrightNotice `Slideshow.CopyrightNotice`\endlink
9202 /// <p>
9203 /// }
9204 /// \table_row3{ <b>`Slideshow.Country`</b>,
9205 /// \anchor Slideshow_Country
9206 /// _string_,
9207 /// @return The full name of the country where the current picture was taken.
9208 /// @note This is the value of the IPTC CountryName tag (hex code 0x65).
9209 /// <p><hr>
9210 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Country `Slideshow.Country`\endlink
9211 /// <p>
9212 /// }
9213 /// \table_row3{ <b>`Slideshow.CountryCode`</b>,
9214 /// \anchor Slideshow_CountryCode
9215 /// _string_,
9216 /// @return The country code of the country where the current picture was
9217 /// taken.
9218 /// @note This is the value of the IPTC CountryCode tag (hex code 0x64).
9219 /// <p><hr>
9220 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CountryCode `Slideshow.CountryCode`\endlink
9221 /// <p>
9222 /// }
9223 /// \table_row3{ <b>`Slideshow.Credit`</b>,
9224 /// \anchor Slideshow_Credit
9225 /// _string_,
9226 /// @return Who provided the current picture.
9227 /// @note This is the value of the IPTC Credit tag (hex code 0x6E).
9228 /// <p><hr>
9229 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Credit `Slideshow.Credit`\endlink
9230 /// <p>
9231 /// }
9232 /// \table_row3{ <b>`Slideshow.DigitalZoom`</b>,
9233 /// \anchor Slideshow_DigitalZoom
9234 /// _string_,
9235 /// @return The digital zoom ratio when the current picture was taken.
9236 /// @note This is the value of the EXIF .DigitalZoomRatio tag (hex code 0xA404).
9237 /// <p><hr>
9238 /// @skinning_v13 **[New Infolabel]** \link Slideshow_DigitalZoom `Slideshow.DigitalZoom`\endlink
9239 /// <p>
9240 /// }
9241 /// \table_row3{ <b>`Slideshow.EXIFComment`</b>,
9242 /// \anchor Slideshow_EXIFComment
9243 /// _string_,
9244 /// @return A description of the current picture.
9245 /// @note This is the value of the EXIF User Comment tag (hex code 0x9286).
9246 /// This is the same value as \ref Slideshow_SlideComment "Slideshow.SlideComment".
9247 /// <p>
9248 /// }
9249 /// \table_row3{ <b>`Slideshow.EXIFDate`</b>,
9250 /// \anchor Slideshow_EXIFDate
9251 /// _string_,
9252 /// @return The localized date of the current picture. The short form of the
9253 /// date is used.
9254 /// @note The value of the EXIF DateTimeOriginal tag (hex code
9255 /// 0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
9256 /// value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
9257 /// 0x0132) might be used.
9258 /// <p><hr>
9259 /// @skinning_v13 **[New Infolabel]** \link Slideshow_EXIFDate `Slideshow.EXIFDate`\endlink
9260 /// <p>
9261 /// }
9262 /// \table_row3{ <b>`Slideshow.EXIFDescription`</b>,
9263 /// \anchor Slideshow_EXIFDescription
9264 /// _string_,
9265 /// @return A short description of the current picture. The SlideComment\,
9266 /// EXIFComment or Caption values might contain a longer description.
9267 /// @note This is the value of the EXIF ImageDescription tag (hex code 0x010E).
9268 /// <p>
9269 /// }
9270 /// \table_row3{ <b>`Slideshow.EXIFSoftware`</b>,
9271 /// \anchor Slideshow_EXIFSoftware
9272 /// _string_,
9273 /// @return The name and version of the firmware used by the camera that took
9274 /// the current picture.
9275 /// @note This is the value of the EXIF Software tag (hex code 0x0131).
9276 /// <p>
9277 /// }
9278 /// \table_row3{ <b>`Slideshow.EXIFTime`</b>,
9279 /// \anchor Slideshow_EXIFTime
9280 /// _string_,
9281 /// @return The date/timestamp of the current picture. The localized short
9282 /// form of the date and time is used.
9283 /// @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003) is
9284 /// preferred. If the DateTimeOriginal tag is not found\, the value of
9285 /// DateTimeDigitized (hex code 0x9004) or of DateTime (hex code 0x0132)
9286 /// might be used.
9287 /// <p>
9288 /// }
9289 /// \table_row3{ <b>`Slideshow.Exposure`</b>,
9290 /// \anchor Slideshow_Exposure
9291 /// _string_,
9292 /// @return The class of the program used by the camera to set exposure when
9293 /// the current picture was taken. Values include:
9294 /// - <b>"Manual"</b>
9295 /// - <b>"Program (Auto)"</b>
9296 /// - <b>"Aperture priority (Semi-Auto)"</b>
9297 /// - <b>"Shutter priority (semi-auto)"</b>
9298 /// - etc...
9299 /// @note This is the value of the EXIF ExposureProgram tag
9300 /// (hex code 0x8822).
9301 /// <p><hr>
9302 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Exposure `Slideshow.Exposure`\endlink
9303 /// <p>
9304 /// }
9305 /// \table_row3{ <b>`Slideshow.ExposureBias`</b>,
9306 /// \anchor Slideshow_ExposureBias
9307 /// _string_,
9308 /// @return The exposure bias of the current picture. Typically this is a
9309 /// number between -99.99 and 99.99.
9310 /// @note This is the value of the EXIF ExposureBiasValue tag (hex code 0x9204).
9311 /// <p><hr>
9312 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ExposureBias `Slideshow.ExposureBias`\endlink
9313 /// <p>
9314 /// }
9315 /// \table_row3{ <b>`Slideshow.ExposureMode`</b>,
9316 /// \anchor Slideshow_ExposureMode
9317 /// _string_,
9318 /// @return The exposure mode of the current picture. The possible values are:
9319 /// - <b>"Automatic"</b>
9320 /// - <b>"Manual"</b>
9321 /// - <b>"Auto bracketing"</b>
9322 /// @note This is the value of the EXIF ExposureMode tag (hex code 0xA402).
9323 /// <p>
9324 /// }
9325 /// \table_row3{ <b>`Slideshow.ExposureTime`</b>,
9326 /// \anchor Slideshow_ExposureTime
9327 /// _string_,
9328 /// @return The exposure time of the current picture\, in seconds.
9329 /// @note This is the value of the EXIF ExposureTime tag (hex code 0x829A).
9330 /// If the ExposureTime tag is not found\, the ShutterSpeedValue tag (hex code
9331 /// 0x9201) might be used.
9332 /// <p>
9333 /// }
9334 /// \table_row3{ <b>`Slideshow.Filedate`</b>,
9335 /// \anchor Slideshow_Filedate
9336 /// _string_,
9337 /// @return The file date of the current picture.
9338 /// <p>
9339 /// }
9340 /// \table_row3{ <b>`Slideshow.Filename`</b>,
9341 /// \anchor Slideshow_Filename
9342 /// _string_,
9343 /// @return The file name of the current picture.
9344 /// <p>
9345 /// }
9346 /// \table_row3{ <b>`Slideshow.Filesize`</b>,
9347 /// \anchor Slideshow_Filesize
9348 /// _string_,
9349 /// @return The file size of the current picture.
9350 /// <p>
9351 /// }
9352 /// \table_row3{ <b>`Slideshow.FlashUsed`</b>,
9353 /// \anchor Slideshow_FlashUsed
9354 /// _string_,
9355 /// @return The status of flash when the current picture was taken. The value
9356 /// will be either <b>"Yes"</b> or <b>"No"</b>\, and might include additional information.
9357 /// @note This is the value of the EXIF Flash tag (hex code 0x9209).
9358 /// <p><hr>
9359 /// @skinning_v13 **[New Infolabel]** \link Slideshow_FlashUsed `Slideshow.FlashUsed`\endlink
9360 /// <p>
9361 /// }
9362 /// \table_row3{ <b>`Slideshow.FocalLength`</b>,
9363 /// \anchor Slideshow_FocalLength
9364 /// _string_,
9365 /// @return The focal length of the lens\, in mm.
9366 /// @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
9367 /// <p>
9368 /// }
9369 /// \table_row3{ <b>`Slideshow.FocusDistance`</b>,
9370 /// \anchor Slideshow_FocusDistance
9371 /// _string_,
9372 /// @return The distance to the subject\, in meters.
9373 /// @note This is the value of the EXIF SubjectDistance tag (hex code 0x9206).
9374 /// <p>
9375 /// }
9376 /// \table_row3{ <b>`Slideshow.Headline`</b>,
9377 /// \anchor Slideshow_Headline
9378 /// _string_,
9379 /// @return A synopsis of the contents of the current picture.
9380 /// @note This is the value of the IPTC Headline tag (hex code 0x69).
9381 /// <p><hr>
9382 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Headline `Slideshow.Headline`\endlink
9383 /// <p>
9384 /// }
9385 /// \table_row3{ <b>`Slideshow.ImageType`</b>,
9386 /// \anchor Slideshow_ImageType
9387 /// _string_,
9388 /// @return The color components of the current picture.
9389 /// @note This is the value of the IPTC ImageType tag (hex code 0x82).
9390 /// <p><hr>
9391 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ImageType `Slideshow.ImageType`\endlink
9392 /// <p>
9393 /// }
9394 /// \table_row3{ <b>`Slideshow.IPTCDate`</b>,
9395 /// \anchor Slideshow_IPTCDate
9396 /// _string_,
9397 /// @return The date when the intellectual content of the current picture was
9398 /// created\, rather than when the picture was created.
9399 /// @note This is the value of the IPTC DateCreated tag (hex code 0x37).
9400 /// <p>
9401 /// }
9402 /// \table_row3{ <b>`Slideshow.ISOEquivalence`</b>,
9403 /// \anchor Slideshow_ISOEquivalence
9404 /// _string_,
9405 /// @return The ISO speed of the camera when the current picture was taken.
9406 /// @note This is the value of the EXIF ISOSpeedRatings tag (hex code 0x8827).
9407 /// <p>
9408 /// }
9409 /// \table_row3{ <b>`Slideshow.Keywords`</b>,
9410 /// \anchor Slideshow_Keywords
9411 /// _string_,
9412 /// @return The keywords assigned to the current picture.
9413 /// @note This is the value of the IPTC Keywords tag (hex code 0x19).
9414 /// <p>
9415 /// }
9416 /// \table_row3{ <b>`Slideshow.Latitude`</b>,
9417 /// \anchor Slideshow_Latitude
9418 /// _string_,
9419 /// @return The latitude where the current picture was taken (degrees\,
9420 /// minutes\, seconds North or South).
9421 /// @note This is the value of the EXIF GPSInfo.GPSLatitude and
9422 /// GPSInfo.GPSLatitudeRef tags.
9423 /// <p>
9424 /// }
9425 /// \table_row3{ <b>`Slideshow.LightSource`</b>,
9426 /// \anchor Slideshow_LightSource
9427 /// _string_,
9428 /// @return The kind of light source when the picture was taken. Possible
9429 /// values include:
9430 /// - <b>"Daylight"</b>
9431 /// - <b>"Fluorescent"</b>
9432 /// - <b>"Incandescent"</b>
9433 /// - etc...
9434 /// @note This is the value of the EXIF LightSource tag (hex code 0x9208).
9435 /// <p><hr>
9436 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LightSource `Slideshow.LightSource`\endlink
9437 /// <p>
9438 /// }
9439 /// \table_row3{ <b>`Slideshow.LongEXIFDate`</b>,
9440 /// \anchor Slideshow_LongEXIFDate
9441 /// _string_,
9442 /// @return Only the localized date of the current picture. The long form of
9443 /// the date is used.
9444 /// @note The value of the EXIF DateTimeOriginal tag (hex code
9445 /// 0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
9446 /// value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
9447 /// 0x0132) might be used.
9448 /// <p><hr>
9449 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFDate `Slideshow.LongEXIFDate`\endlink
9450 /// <p>
9451 /// }
9452 /// \table_row3{ <b>`Slideshow.LongEXIFTime`</b>,
9453 /// \anchor Slideshow_LongEXIFTime
9454 /// _string_,
9455 /// @return The date/timestamp of the current picture. The localized long form
9456 /// of the date and time is used.
9457 /// @note The value of the EXIF DateTimeOriginal tag
9458 /// (hex code 0x9003) is preferred. if the DateTimeOriginal tag is not found\,
9459 /// the value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex
9460 /// code 0x0132) might be used.
9461 /// <p><hr>
9462 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFTime `Slideshow.LongEXIFTime`\endlink
9463 /// <p>
9464 /// }
9465 /// \table_row3{ <b>`Slideshow.Longitude`</b>,
9466 /// \anchor Slideshow_Longitude
9467 /// _string_,
9468 /// @return The longitude where the current picture was taken (degrees\,
9469 /// minutes\, seconds East or West).
9470 /// @note This is the value of the EXIF GPSInfo.GPSLongitude and
9471 /// GPSInfo.GPSLongitudeRef tags.
9472 /// <p>
9473 /// }
9474 /// \table_row3{ <b>`Slideshow.MeteringMode`</b>,
9475 /// \anchor Slideshow_MeteringMode
9476 /// _string_,
9477 /// @return The metering mode used when the current picture was taken. The
9478 /// possible values are:
9479 /// - <b>"Center weight"</b>
9480 /// - <b>"Spot"</b>
9481 /// - <b>"Matrix"</b>
9482 /// @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
9483 /// <p><hr>
9484 /// @skinning_v13 **[New Infolabel]** \link Slideshow_MeteringMode `Slideshow.MeteringMode`\endlink
9485 /// <p>
9486 /// }
9487 /// \table_row3{ <b>`Slideshow.ObjectName`</b>,
9488 /// \anchor Slideshow_ObjectName
9489 /// _string_,
9490 /// @return a shorthand reference for the current picture.
9491 /// @note This is the value of the IPTC ObjectName tag (hex code 0x05).
9492 /// <p><hr>
9493 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ObjectName `Slideshow.ObjectName`\endlink
9494 /// <p>
9495 /// }
9496 /// \table_row3{ <b>`Slideshow.Orientation`</b>,
9497 /// \anchor Slideshow_Orientation
9498 /// _string_,
9499 /// @return The orientation of the current picture. Possible values are:
9500 /// - <b>"Top Left"</b>
9501 /// - <b>"Top Right"</b>
9502 /// - <b>"Left Top"</b>
9503 /// - <b>"Right Bottom"</b>
9504 /// - etc...
9505 /// @note This is the value of the EXIF Orientation tag (hex code 0x0112).
9506 /// <p><hr>
9507 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Orientation `Slideshow.Orientation`\endlink
9508 /// <p>
9509 /// }
9510 /// \table_row3{ <b>`Slideshow.Path`</b>,
9511 /// \anchor Slideshow_Path
9512 /// _string_,
9513 /// @return The file path of the current picture.
9514 /// <p>
9515 /// }
9516 /// \table_row3{ <b>`Slideshow.Process`</b>,
9517 /// \anchor Slideshow_Process
9518 /// _string_,
9519 /// @return The process used to compress the current picture.
9520 /// <p>
9521 /// @deprecated \link Slideshow_Process `Slideshow.Process`\endlink is deprecated and will be removed in future Kodi versions
9522 /// <p><hr>
9523 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Process `Slideshow.Process`\endlink
9524 /// <p>
9525 /// }
9526 /// \table_row3{ <b>`Slideshow.ReferenceService`</b>,
9527 /// \anchor Slideshow_ReferenceService
9528 /// _string_,
9529 /// @return The Service Identifier of a prior envelope to which the current
9530 /// picture refers.
9531 /// @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
9532 /// <p><hr>
9533 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ReferenceService `Slideshow.ReferenceService`\endlink
9534 /// <p>
9535 /// }
9536 /// \table_row3{ <b>`Slideshow.Resolution`</b>,
9537 /// \anchor Slideshow_Resolution
9538 /// _string_,
9539 /// @return The dimensions of the current picture (Width x Height)
9540 /// <p>
9541 /// }
9542 /// \table_row3{ <b>`Slideshow.SlideComment`</b>,
9543 /// \anchor Slideshow_SlideComment
9544 /// _string_,
9545 /// @return A description of the current picture.
9546 /// @note This is the value of the EXIF User Comment tag (hex code 0x9286).
9547 /// This is the same value as \ref Slideshow_EXIFComment "Slideshow.EXIFComment".
9548 /// <p>
9549 /// }
9550 /// \table_row3{ <b>`Slideshow.SlideIndex`</b>,
9551 /// \anchor Slideshow_SlideIndex
9552 /// _string_,
9553 /// @return The slide index of the current picture.
9554 /// <p>
9555 /// }
9556 /// \table_row3{ <b>`Slideshow.Source`</b>,
9557 /// \anchor Slideshow_Source
9558 /// _string_,
9559 /// @return The original owner of the current picture.
9560 /// @note This is the value of the IPTC Source tag (hex code 0x73).
9561 /// <p><hr>
9562 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Source `Slideshow.Source`\endlink
9563 /// <p>
9564 /// }
9565 /// \table_row3{ <b>`Slideshow.SpecialInstructions`</b>,
9566 /// \anchor Slideshow_SpecialInstructions
9567 /// _string_,
9568 /// @return Other editorial instructions concerning the use of the current
9569 /// picture.
9570 /// @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
9571 /// <p><hr>
9572 /// @skinning_v13 **[New Infolabel]** \link Slideshow_SpecialInstructions `Slideshow.SpecialInstructions`\endlink
9573 /// <p>
9574 /// }
9575 /// \table_row3{ <b>`Slideshow.State`</b>,
9576 /// \anchor Slideshow_State
9577 /// _string_,
9578 /// @return The State/Province where the current picture was taken.
9579 /// @note This is the value of the IPTC ProvinceState tag (hex code 0x5F).
9580 /// <p><hr>
9581 /// @skinning_v13 **[New Infolabel]** \link Slideshow_State `Slideshow.State`\endlink
9582 /// <p>
9583 /// }
9584 /// \table_row3{ <b>`Slideshow.Sublocation`</b>,
9585 /// \anchor Slideshow_Sublocation
9586 /// _string_,
9587 /// @return The location within a city where the current picture was taken -
9588 /// might indicate the nearest landmark.
9589 /// @note This is the value of the IPTC SubLocation tag (hex code 0x5C).
9590 /// <p><hr>
9591 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Sublocation `Slideshow.Sublocation`\endlink
9592 /// <p>
9593 /// }
9594 /// \table_row3{ <b>`Slideshow.SupplementalCategories`</b>,
9595 /// \anchor Slideshow_SupplementalCategories
9596 /// _string_,
9597 /// @return The supplemental category codes to further refine the subject of the
9598 /// current picture.
9599 /// @note This is the value of the IPTC SuppCategory tag (hex
9600 /// code 0x14).
9601 /// <p><hr>
9602 /// @skinning_v13 **[New Infolabel]** \link Slideshow_SupplementalCategories `Slideshow.SupplementalCategories`\endlink
9603 /// <p>
9604 /// }
9605 /// \table_row3{ <b>`Slideshow.TimeCreated`</b>,
9606 /// \anchor Slideshow_TimeCreated
9607 /// _string_,
9608 /// @return The time when the intellectual content of the current picture was
9609 /// created\, rather than when the picture was created.
9610 /// @note This is the value of the IPTC TimeCreated tag (hex code 0x3C).
9611 /// <p><hr>
9612 /// @skinning_v13 **[New Infolabel]** \link Slideshow_TimeCreated `Slideshow.TimeCreated`\endlink
9613 /// <p>
9614 /// }
9615 /// \table_row3{ <b>`Slideshow.TransmissionReference`</b>,
9616 /// \anchor Slideshow_TransmissionReference
9617 /// _string_,
9618 /// @return A code representing the location of original transmission of the
9619 /// current picture.
9620 /// @note This is the value of the IPTC TransmissionReference tag
9621 /// (hex code 0x67).
9622 /// <p><hr>
9623 /// @skinning_v13 **[New Infolabel]** \link Slideshow_TransmissionReference `Slideshow.TransmissionReference`\endlink
9624 /// <p>
9625 /// }
9626 /// \table_row3{ <b>`Slideshow.Urgency`</b>,
9627 /// \anchor Slideshow_Urgency
9628 /// _string_,
9629 /// @return The urgency of the current picture. Values are 1-9. The 1 is most
9630 /// urgent.
9631 /// @note Some image management programs use urgency to indicate picture
9632 /// rating\, where urgency 1 is 5 stars and urgency 5 is 1 star. Urgencies
9633 /// 6-9 are not used for rating. This is the value of the IPTC Urgency tag
9634 /// (hex code 0x0A).
9635 /// <p><hr>
9636 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Urgency `Slideshow.Urgency`\endlink
9637 /// <p>
9638 /// }
9639 /// \table_row3{ <b>`Slideshow.WhiteBalance`</b>,
9640 /// \anchor Slideshow_WhiteBalance
9641 /// _string_,
9642 /// @return The white balance mode set when the current picture was taken.
9643 /// The possible values are:
9644 /// - <b>"Manual"</b>
9645 /// - <b>"Auto"</b>
9646 /// <p>
9647 /// @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
9648 /// <p><hr>
9649 /// @skinning_v13 **[New Infolabel]** \link Slideshow_WhiteBalance `Slideshow.WhiteBalance`\endlink
9650 /// <p>
9651 /// }
9652 /// \table_end
9654 /// -----------------------------------------------------------------------------
9655 const infomap slideshow[] = {{ "ispaused", SLIDESHOW_ISPAUSED },
9656 { "isactive", SLIDESHOW_ISACTIVE },
9657 { "isvideo", SLIDESHOW_ISVIDEO },
9658 { "israndom", SLIDESHOW_ISRANDOM },
9659 { "filename", SLIDESHOW_FILE_NAME },
9660 { "path", SLIDESHOW_FILE_PATH },
9661 { "filesize", SLIDESHOW_FILE_SIZE },
9662 { "filedate", SLIDESHOW_FILE_DATE },
9663 { "slideindex", SLIDESHOW_INDEX },
9664 { "resolution", SLIDESHOW_RESOLUTION },
9665 { "slidecomment", SLIDESHOW_COMMENT },
9666 { "colour", SLIDESHOW_COLOUR },
9667 { "process", SLIDESHOW_PROCESS },
9668 { "exiftime", SLIDESHOW_EXIF_DATE_TIME },
9669 { "exifdate", SLIDESHOW_EXIF_DATE },
9670 { "longexiftime", SLIDESHOW_EXIF_LONG_DATE_TIME },
9671 { "longexifdate", SLIDESHOW_EXIF_LONG_DATE },
9672 { "exifdescription", SLIDESHOW_EXIF_DESCRIPTION },
9673 { "cameramake", SLIDESHOW_EXIF_CAMERA_MAKE },
9674 { "cameramodel", SLIDESHOW_EXIF_CAMERA_MODEL },
9675 { "exifcomment", SLIDESHOW_EXIF_COMMENT },
9676 { "exifsoftware", SLIDESHOW_EXIF_SOFTWARE },
9677 { "aperture", SLIDESHOW_EXIF_APERTURE },
9678 { "focallength", SLIDESHOW_EXIF_FOCAL_LENGTH },
9679 { "focusdistance", SLIDESHOW_EXIF_FOCUS_DIST },
9680 { "exposure", SLIDESHOW_EXIF_EXPOSURE },
9681 { "exposuretime", SLIDESHOW_EXIF_EXPOSURE_TIME },
9682 { "exposurebias", SLIDESHOW_EXIF_EXPOSURE_BIAS },
9683 { "exposuremode", SLIDESHOW_EXIF_EXPOSURE_MODE },
9684 { "flashused", SLIDESHOW_EXIF_FLASH_USED },
9685 { "whitebalance", SLIDESHOW_EXIF_WHITE_BALANCE },
9686 { "lightsource", SLIDESHOW_EXIF_LIGHT_SOURCE },
9687 { "meteringmode", SLIDESHOW_EXIF_METERING_MODE },
9688 { "isoequivalence", SLIDESHOW_EXIF_ISO_EQUIV },
9689 { "digitalzoom", SLIDESHOW_EXIF_DIGITAL_ZOOM },
9690 { "ccdwidth", SLIDESHOW_EXIF_CCD_WIDTH },
9691 { "orientation", SLIDESHOW_EXIF_ORIENTATION },
9692 { "supplementalcategories", SLIDESHOW_IPTC_SUP_CATEGORIES },
9693 { "keywords", SLIDESHOW_IPTC_KEYWORDS },
9694 { "caption", SLIDESHOW_IPTC_CAPTION },
9695 { "author", SLIDESHOW_IPTC_AUTHOR },
9696 { "headline", SLIDESHOW_IPTC_HEADLINE },
9697 { "specialinstructions", SLIDESHOW_IPTC_SPEC_INSTR },
9698 { "category", SLIDESHOW_IPTC_CATEGORY },
9699 { "byline", SLIDESHOW_IPTC_BYLINE },
9700 { "bylinetitle", SLIDESHOW_IPTC_BYLINE_TITLE },
9701 { "credit", SLIDESHOW_IPTC_CREDIT },
9702 { "source", SLIDESHOW_IPTC_SOURCE },
9703 { "copyrightnotice", SLIDESHOW_IPTC_COPYRIGHT_NOTICE },
9704 { "objectname", SLIDESHOW_IPTC_OBJECT_NAME },
9705 { "city", SLIDESHOW_IPTC_CITY },
9706 { "state", SLIDESHOW_IPTC_STATE },
9707 { "country", SLIDESHOW_IPTC_COUNTRY },
9708 { "transmissionreference", SLIDESHOW_IPTC_TX_REFERENCE },
9709 { "iptcdate", SLIDESHOW_IPTC_DATE },
9710 { "urgency", SLIDESHOW_IPTC_URGENCY },
9711 { "countrycode", SLIDESHOW_IPTC_COUNTRY_CODE },
9712 { "referenceservice", SLIDESHOW_IPTC_REF_SERVICE },
9713 { "latitude", SLIDESHOW_EXIF_GPS_LATITUDE },
9714 { "longitude", SLIDESHOW_EXIF_GPS_LONGITUDE },
9715 { "altitude", SLIDESHOW_EXIF_GPS_ALTITUDE },
9716 { "timecreated", SLIDESHOW_IPTC_TIMECREATED },
9717 { "sublocation", SLIDESHOW_IPTC_SUBLOCATION },
9718 { "imagetype", SLIDESHOW_IPTC_IMAGETYPE },
9721 /// \page modules__infolabels_boolean_conditions
9722 /// \subsection modules__infolabels_boolean_conditions_Library Library
9723 /// @todo Make this annotate an array of infobools/labels to make it easier to track
9724 /// \table_start
9725 /// \table_h3{ Labels, Type, Description }
9726 /// \table_row3{ <b>`Library.IsScanning`</b>,
9727 /// \anchor Library_IsScanning
9728 /// _boolean_,
9729 /// @return **True** if the library is being scanned.
9730 /// <p>
9731 /// }
9732 /// \table_row3{ <b>`Library.IsScanningVideo`</b>,
9733 /// \anchor Library_IsScanningVideo
9734 /// _boolean_,
9735 /// @return **True** if the video library is being scanned.
9736 /// <p>
9737 /// }
9738 /// \table_row3{ <b>`Library.IsScanningMusic`</b>,
9739 /// \anchor Library_IsScanningMusic
9740 /// _boolean_,
9741 /// @return **True** if the music library is being scanned.
9742 /// <p>
9743 /// }
9744 /// \table_row3{ <b>`Library.HasContent(music)`</b>,
9745 /// \anchor Library_HasContent_Music
9746 /// _boolean_,
9747 /// @return **True** if the library has music content.
9748 /// <p>
9749 /// }
9750 /// \table_row3{ <b>`Library.HasContent(video)`</b>,
9751 /// \anchor Library_HasContent_Video
9752 /// _boolean_,
9753 /// @return **True** if the library has video content.
9754 /// <p>
9755 /// }
9756 /// \table_row3{ <b>`Library.HasContent(movies)`</b>,
9757 /// \anchor Library_HasContent_Movies
9758 /// _boolean_,
9759 /// @return **True** if the library has movies.
9760 /// <p>
9761 /// }
9762 /// \table_row3{ <b>`Library.HasContent(tvshows)`</b>,
9763 /// \anchor Library_HasContent_TVShows
9764 /// _boolean_,
9765 /// @return **True** if the library has tvshows.
9766 /// <p>
9767 /// }
9768 /// \table_row3{ <b>`Library.HasContent(musicvideos)`</b>,
9769 /// \anchor Library_HasContent_MusicVideos
9770 /// _boolean_,
9771 /// @return **True** if the library has music videos.
9772 /// <p>
9773 /// }
9774 /// \table_row3{ <b>`Library.HasContent(moviesets)`</b>,
9775 /// \anchor Library_HasContent_MovieSets
9776 /// _boolean_,
9777 /// @return **True** if the library has movie sets.
9778 /// <p>
9779 /// }
9780 /// \table_row3{ <b>`Library.HasContent(singles)`</b>,
9781 /// \anchor Library_HasContent_Singles
9782 /// _boolean_,
9783 /// @return **True** if the library has singles.
9784 /// <p>
9785 /// }
9786 /// \table_row3{ <b>`Library.HasContent(compilations)`</b>,
9787 /// \anchor Library_HasContent_Compilations
9788 /// _boolean_,
9789 /// @return **True** if the library has compilations.
9790 /// <p>
9791 /// }
9792 /// \table_row3{ <b>`Library.HasContent(Role.Composer)`</b>,
9793 /// \anchor Library_HasContent_Role_Composer
9794 /// _boolean_,
9795 /// @return **True** if there are songs in the library which have composers.
9796 /// <p><hr>
9797 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Composer `Library.HasContent(Role.Composer)`\endlink
9798 /// <p>
9799 /// }
9800 /// \table_row3{ <b>`Library.HasContent(Role.Conductor)`</b>,
9801 /// \anchor Library_HasContent_Role_Conductor
9802 /// _boolean_,
9803 /// @return **True** if there are songs in the library which have a conductor.
9804 /// <p><hr>
9805 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Conductor `Library.HasContent(Role.Conductor)`\endlink
9806 /// <p>
9807 /// }
9808 /// \table_row3{ <b>`Library.HasContent(Role.Orchestra)`</b>,
9809 /// \anchor Library_HasContent_Role_Orchestra
9810 /// _boolean_,
9811 /// @return **True** if there are songs in the library which have an orchestra.
9812 /// <p><hr>
9813 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Orchestra `Library.HasContent(Role.Orchestra)`\endlink
9814 /// <p>
9815 /// }
9816 /// \table_row3{ <b>`Library.HasContent(Role.Lyricist)`</b>,
9817 /// \anchor Library_HasContent_Role_Lyricist
9818 /// _boolean_,
9819 /// @return **True** if there are songs in the library which have a lyricist.
9820 /// <p><hr>
9821 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Lyricist `Library.HasContent(Role.Lyricist)`\endlink
9822 /// <p>
9823 /// }
9824 /// \table_row3{ <b>`Library.HasContent(Role.Remixer)`</b>,
9825 /// \anchor Library_HasContent_Role_Remixer
9826 /// _boolean_,
9827 /// @return **True** if there are songs in the library which have a remixer.
9828 /// <p><hr>
9829 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Remixer)`\endlink
9830 /// <p>
9831 /// }
9832 /// \table_row3{ <b>`Library.HasContent(Role.Arranger)`</b>,
9833 /// \anchor Library_HasContent_Role_Remixer
9834 /// _boolean_,
9835 /// @return **True** if there are songs in the library which have an arranger.
9836 /// <p><hr>
9837 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Arranger)`\endlink
9838 /// <p>
9839 /// }
9840 /// \table_row3{ <b>`Library.HasContent(Role.Engineer)`</b>,
9841 /// \anchor Library_HasContent_Role_Engineer
9842 /// _boolean_,
9843 /// @return **True** if there are songs in the library which have an engineer.
9844 /// <p><hr>
9845 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Engineer `Library.HasContent(Role.Engineer)`\endlink
9846 /// <p>
9847 /// }
9848 /// \table_row3{ <b>`Library.HasContent(Role.Producer)`</b>,
9849 /// \anchor Library_HasContent_Role_Producer
9850 /// _boolean_,
9851 /// @return **True** if there are songs in the library which have an producer.
9852 /// <p><hr>
9853 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Producer `Library.HasContent(Role.Producer)`\endlink
9854 /// <p>
9855 /// }
9856 /// \table_row3{ <b>`Library.HasContent(Role.DJMixer)`</b>,
9857 /// \anchor Library_HasContent_Role_DJMixer
9858 /// _boolean_,
9859 /// @return **True** if there are songs in the library which have a DJMixer.
9860 /// <p><hr>
9861 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_DJMixer `Library.HasContent(Role.DJMixer)`\endlink
9862 /// <p>
9863 /// }
9864 /// \table_row3{ <b>`Library.HasContent(Role.Mixer)`</b>,
9865 /// \anchor Library_HasContent_Role_Mixer
9866 /// _boolean_,
9867 /// @return **True** if there are songs in the library which have a mixer.
9868 /// <p><hr>
9869 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Mixer `Library.HasContent(Role.Mixer)`\endlink
9870 /// <p>
9871 /// }
9872 /// \table_row3{ <b>`Library.HasContent(boxsets)`</b>,
9873 /// \anchor Library_HasContent_Boxsets
9874 /// _boolean_,
9875 /// @return **True** if there are albums in the library which are boxsets.
9876 /// <p><hr>
9877 /// @skinning_v19 **[New Boolean Condition]** \link Library_HasContent_Boxsets `Library.HasContent(boxsets)`\endlink
9878 /// <p>
9879 /// }
9880 /// \table_row3{ <b>`Library.HasNode(path)`</b>,
9881 /// \anchor Library_HasNode
9882 /// _boolean_,
9883 /// @return **True** if there the node is present in the library.
9884 /// <p><hr>
9885 /// @skinning_v19 **[New Boolean Condition]** \link Library_HasNode `Library.HasNode(path)`\endlink
9886 /// <p>
9887 /// }
9888 /// \table_end
9890 /// -----------------------------------------------------------------------------
9892 /// \page modules__infolabels_boolean_conditions
9893 /// \section modules_rm_infolabels_booleans Additional revision history for Infolabels and Boolean Conditions
9894 /// <hr>
9895 /// \subsection modules_rm_infolabels_booleans_v22 Kodi v22
9896 /// @skinning_v22 **[Removed Infolabels]** The following infolabels have been removed:
9897 /// - `Player.Cutlist` - Please use \link Player_Editlist `Player.EditList`\endlink for the EDL list and \link Player_Cuts `Player.Cuts`\endlink for the cut markers
9899 /// <hr>
9900 /// \subsection modules_rm_infolabels_booleans_v21 Kodi v21 (Omega)
9901 /// @skinning_v21 **[Removed Infolabels]** The following infolabels have been removed:
9902 /// - `Network.DHCPAddress` - this info did not return any meaningful value (always an empty string)
9904 /// <hr>
9905 /// \subsection modules_rm_infolabels_booleans_v20 Kodi v20 (Nexus)
9906 /// @skinning_v20 **[Removed Boolean conditions]** The following boolean conditions have been removed:
9907 /// - `Player.DisplayAfterSeek` - use \link Player_HasPerformedSeek `Player.HasPerformedSeek(interval)`\endlink instead
9909 /// <hr>
9910 /// \subsection modules_rm_infolabels_booleans_v19 Kodi v19 (Matrix)
9911 /// @skinning_v19 **[Removed Infolabels]** The following infolabels have been removed:
9912 /// - `System.Platform.Linux.RaspberryPi` - use \link System_Platform_Linux `System.Platform.Linux`\endlink instead
9914 /// <hr>
9915 /// \subsection modules_rm_infolabels_booleans_v18 Kodi v18 (Leia)
9917 /// @skinning_v18 **[Removed Infolabels]** The following infolabels have been removed:
9918 /// - `Listitem.Property(artistthumbs)`, `Listitem.Property(artistthumb)` - use
9919 /// \link ListItem_Art_Type `ListItem.Art(type)`\endlink with <b>albumartist[n].*</b> or <b>artist[n].*</b> as <b>type</b>
9920 /// - `ADSP.ActiveStreamType`
9921 /// - `ADSP.DetectedStreamType`
9922 /// - `ADSP.MasterName`
9923 /// - `ADSP.MasterInfo`
9924 /// - `ADSP.MasterOwnIcon`
9925 /// - `ADSP.MasterOverrideIcon`
9926 /// - `ListItem.ChannelNumber`, `ListItem.SubChannelNumber`, `MusicPlayer.ChannelNumber`,
9927 /// `MusicPlayer.SubChannelNumber`, `VideoPlayer.ChannelNumber`,
9928 /// `VideoPlayer.SubChannelNumber`. Please use the following alternatives
9929 /// \link ListItem_ChannelNumberLabel `ListItem.ChannelNumberLabel` \endlink,
9930 /// \link MusicPlayer_ChannelNumberLabel `MusicPlayer.ChannelNumberLabel` \endlink
9931 /// \link VideoPlayer_ChannelNumberLabel `VideoPlayer.ChannelNumberLabel` \endlink from now on.
9933 /// @skinning_v18 **[Removed Boolean Conditions]** The following infobools have been removed:
9934 /// - `System.HasModalDialog` - use \link System_HasActiveModalDialog `System.HasActiveModalDialog` \endlink and
9935 /// \link System_HasVisibleModalDialog `System.HasVisibleModalDialog`\endlink instead
9936 /// - `StringCompare()` - use \link String_IsEqual `String.IsEqual(info,string)`\endlink instead
9937 /// - `SubString()` - use \link String_Contains `String.Contains(info,substring)`\endlink instead
9938 /// - `IntegerGreaterThan()` - use \link Integer_IsGreater `Integer.IsGreater(info,number)`\endlink instead
9939 /// - `IsEmpty()` - use \link String_IsEmpty `String.IsEmpty(info)`\endlink instead
9940 /// - `System.HasADSP`
9941 /// - `ADSP.IsActive`
9942 /// - `ADSP.HasInputResample`
9943 /// - `ADSP.HasPreProcess`
9944 /// - `ADSP.HasMasterProcess`
9945 /// - `ADSP.HasPostProcess`
9946 /// - `ADSP.HasOutputResample`
9947 /// - `ADSP.MasterActive`
9948 /// <hr>
9949 /// \subsection modules_rm_infolabels_booleans_v17 Kodi v17 (Krypton)
9950 /// @skinning_v17 **[Removed Infolabels]** The following infolabels have been removed:
9951 /// - `ListItem.StarRating` - use the other ratings instead.
9953 /// @skinning_v17 **[Removed Boolean Conditions]** The following infobools have been removed:
9954 /// - `on` - use `true` instead
9955 /// - `off` - use `false` instead
9956 /// - `Player.ShowCodec`
9957 /// - `System.GetBool(pvrmanager.enabled)`
9958 /// <hr>
9959 /// \subsection modules_rm_infolabels_booleans_v16 Kodi v16 (Jarvis)
9960 /// @skinning_v16 **[New Boolean Conditions]** The following infobools were added:
9961 /// - `System.HasADSP`
9962 /// - `ADSP.IsActive`
9963 /// - `ADSP.HasInputResample`
9964 /// - `ADSP.HasPreProcess`
9965 /// - `ADSP.HasMasterProcess`
9966 /// - `ADSP.HasPostProcess`
9967 /// - `ADSP.HasOutputResample`
9968 /// - `ADSP.MasterActive`
9969 /// - `System.HasModalDialog`
9971 /// @skinning_v16 **[New Infolabels]** The following infolabels were added:
9972 /// - `ADSP.ActiveStreamType`
9973 /// - `ADSP.DetectedStreamType`
9974 /// - `ADSP.MasterName`
9975 /// - `ADSP.MasterInfo`
9976 /// - `ADSP.MasterOwnIcon`
9977 /// - `ADSP.MasterOverrideIcon`
9979 /// @skinning_v16 **[Removed Boolean Conditions]** The following infobols were removed:
9980 /// - `System.Platform.ATV2`
9982 /// <hr>
9983 /// \subsection modules_rm_infolabels_booleans_v15 Kodi v15 (Isengard)
9984 /// <hr>
9985 /// \subsection modules_rm_infolabels_booleans_v14 Kodi v14 (Helix)
9986 /// @skinning_v14 **[New Infolabels]** The following infolabels were added:
9987 /// - `ListItem.SubChannelNumber`
9988 /// - `MusicPlayer.SubChannelNumber`
9989 /// - `VideoPlayer.SubChannelNumber`
9991 /// <hr>
9992 /// \subsection modules_rm_infolabels_booleans_v13 XBMC v13 (Gotham)
9993 /// @skinning_v13 **[Removed Infolabels]** The following infolabels were removed:
9994 /// - `Network.SubnetAddress`
9996 /// <hr>
9997 // Crazy part, to use tableofcontents must it be on end
9998 /// \page modules__infolabels_boolean_conditions
9999 /// \tableofcontents
10001 CGUIInfoManager::Property::Property(const std::string &property, const std::string &parameters)
10002 : name(property)
10004 CUtil::SplitParams(parameters, params);
10007 const std::string &CGUIInfoManager::Property::param(unsigned int n /* = 0 */) const
10009 if (n < params.size())
10010 return params[n];
10011 return StringUtils::Empty;
10014 unsigned int CGUIInfoManager::Property::num_params() const
10016 return params.size();
10019 void CGUIInfoManager::SplitInfoString(const std::string &infoString, std::vector<Property> &info)
10021 // our string is of the form:
10022 // category[(params)][.info(params).info2(params)] ...
10023 // so we need to split on . while taking into account of () pairs
10024 unsigned int parentheses = 0;
10025 std::string property;
10026 std::string param;
10027 for (size_t i = 0; i < infoString.size(); ++i)
10029 if (infoString[i] == '(')
10031 if (!parentheses++)
10032 continue;
10034 else if (infoString[i] == ')')
10036 if (!parentheses)
10037 CLog::Log(LOGERROR, "unmatched parentheses in {}", infoString);
10038 else if (!--parentheses)
10039 continue;
10041 else if (infoString[i] == '.' && !parentheses)
10043 if (!property.empty()) // add our property and parameters
10045 StringUtils::ToLower(property);
10046 info.emplace_back(property, param);
10048 property.clear();
10049 param.clear();
10050 continue;
10052 if (parentheses)
10053 param += infoString[i];
10054 else
10055 property += infoString[i];
10058 if (parentheses)
10059 CLog::Log(LOGERROR, "unmatched parentheses in {}", infoString);
10061 if (!property.empty())
10063 StringUtils::ToLower(property);
10064 info.emplace_back(property, param);
10068 /// \brief Translates a string as given by the skin into an int that we use for more
10069 /// efficient retrieval of data.
10070 int CGUIInfoManager::TranslateSingleString(const std::string &strCondition)
10072 bool listItemDependent;
10073 return TranslateSingleString(strCondition, listItemDependent);
10076 int CGUIInfoManager::TranslateSingleString(const std::string &strCondition, bool &listItemDependent)
10078 /* We need to disable caching in INFO::InfoBool::Get if either of the following are true:
10079 * 1. if condition is between LISTITEM_START and LISTITEM_END
10080 * 2. if condition is string or integer the corresponding label is between LISTITEM_START and LISTITEM_END
10081 * This is achieved by setting the bool pointed at by listItemDependent, either here or in a recursive call
10083 // trim whitespaces
10084 std::string strTest = strCondition;
10085 StringUtils::Trim(strTest);
10087 std::vector< Property> info;
10088 SplitInfoString(strTest, info);
10090 if (info.empty())
10091 return 0;
10093 const Property &cat = info[0];
10094 if (info.size() == 1)
10095 { // single category
10096 if (cat.name == "false" || cat.name == "no")
10097 return SYSTEM_ALWAYS_FALSE;
10098 else if (cat.name == "true" || cat.name == "yes")
10099 return SYSTEM_ALWAYS_TRUE;
10101 else if (info.size() == 2)
10103 const Property &prop = info[1];
10104 if (cat.name == "string")
10106 if (prop.name == "isempty")
10108 return AddMultiInfo(CGUIInfo(STRING_IS_EMPTY, TranslateSingleString(prop.param(), listItemDependent)));
10110 else if (prop.num_params() == 2)
10112 for (const infomap& string_bool : string_bools)
10114 if (prop.name == string_bool.str)
10116 int data1 = TranslateSingleString(prop.param(0), listItemDependent);
10117 // pipe our original string through the localize parsing then make it lowercase (picks up $LBRACKET etc.)
10118 std::string label = CGUIInfoLabel::GetLabel(prop.param(1), INFO::DEFAULT_CONTEXT);
10119 StringUtils::ToLower(label);
10120 // 'true', 'false', 'yes', 'no' are valid strings, do not resolve them to SYSTEM_ALWAYS_TRUE or SYSTEM_ALWAYS_FALSE
10121 if (label != "true" && label != "false" && label != "yes" && label != "no")
10123 int data2 = TranslateSingleString(prop.param(1), listItemDependent);
10124 if (data2 > 0)
10125 return AddMultiInfo(CGUIInfo(string_bool.val, data1, -data2));
10127 return AddMultiInfo(CGUIInfo(string_bool.val, data1, label));
10132 if (cat.name == "integer")
10134 if (prop.name == "valueof")
10136 int value = -1;
10137 std::from_chars(prop.param(0).data(), prop.param(0).data() + prop.param(0).size(), value);
10138 return AddMultiInfo(CGUIInfo(INTEGER_VALUEOF, value));
10141 for (const infomap& integer_bool : integer_bools)
10143 if (prop.name == integer_bool.str)
10145 std::array<int, 2> data = {-1, -1};
10146 for (size_t i = 0; i < data.size(); i++)
10148 std::from_chars_result result = std::from_chars(
10149 prop.param(i).data(), prop.param(i).data() + prop.param(i).size(), data.at(i));
10150 if (result.ec == std::errc::invalid_argument)
10152 // could not translate provided value to int, translate the info string
10153 data.at(i) = TranslateSingleString(prop.param(i), listItemDependent);
10155 else
10157 // conversion succeeded, integer value provided - translate it to an Integer.ValueOf() info.
10158 data.at(i) = AddMultiInfo(CGUIInfo(INTEGER_VALUEOF, data.at(i)));
10161 return AddMultiInfo(CGUIInfo(integer_bool.val, data.at(0), data.at(1)));
10165 else if (cat.name == "player")
10167 for (const infomap& player_label : player_labels)
10169 if (prop.name == player_label.str)
10170 return player_label.val;
10172 for (const infomap& player_time : player_times)
10174 if (prop.name == player_time.str)
10175 return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
10177 if (prop.name == "process" && prop.num_params())
10179 for (const infomap& player_proces : player_process)
10181 if (StringUtils::EqualsNoCase(prop.param(), player_proces.str))
10182 return player_proces.val;
10185 if (prop.num_params() == 1)
10187 for (const infomap& i : player_param)
10189 if (prop.name == i.str)
10190 return AddMultiInfo(CGUIInfo(i.val, prop.param()));
10194 else if (cat.name == "addon")
10196 for (const infomap& i : addons)
10198 if (prop.name == i.str && prop.num_params() == 2)
10199 return AddMultiInfo(CGUIInfo(i.val, prop.param(0), prop.param(1)));
10202 else if (cat.name == "weather")
10204 for (const infomap& i : weather)
10206 if (prop.name == i.str)
10207 return i.val;
10210 else if (cat.name == "network")
10212 for (const infomap& network_label : network_labels)
10214 if (prop.name == network_label.str)
10215 return network_label.val;
10218 else if (cat.name == "musicpartymode")
10220 for (const infomap& i : musicpartymode)
10222 if (prop.name == i.str)
10223 return i.val;
10226 else if (cat.name == "system")
10228 for (const infomap& system_label : system_labels)
10230 if (prop.name == system_label.str)
10231 return system_label.val;
10233 if (prop.num_params() == 1)
10235 const std::string &param = prop.param();
10236 if (prop.name == "getbool")
10238 std::string paramCopy = param;
10239 StringUtils::ToLower(paramCopy);
10240 return AddMultiInfo(CGUIInfo(SYSTEM_GET_BOOL, paramCopy));
10242 for (const infomap& i : system_param)
10244 if (prop.name == i.str)
10245 return AddMultiInfo(CGUIInfo(i.val, param));
10247 if (prop.name == "memory")
10249 if (param == "free")
10250 return SYSTEM_FREE_MEMORY;
10251 else if (param == "free.percent")
10252 return SYSTEM_FREE_MEMORY_PERCENT;
10253 else if (param == "used")
10254 return SYSTEM_USED_MEMORY;
10255 else if (param == "used.percent")
10256 return SYSTEM_USED_MEMORY_PERCENT;
10257 else if (param == "total")
10258 return SYSTEM_TOTAL_MEMORY;
10260 else if (prop.name == "addontitle")
10262 // Example: System.AddonTitle(Skin.String(HomeVideosButton1)) => skin string HomeVideosButton1 holds an addon identifier string
10263 int infoLabel = TranslateSingleString(param, listItemDependent);
10264 if (infoLabel > 0)
10265 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_TITLE, infoLabel, 0));
10266 std::string label = CGUIInfoLabel::GetLabel(param, INFO::DEFAULT_CONTEXT);
10267 StringUtils::ToLower(label);
10268 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_TITLE, label, 1));
10270 else if (prop.name == "addonicon")
10272 int infoLabel = TranslateSingleString(param, listItemDependent);
10273 if (infoLabel > 0)
10274 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_ICON, infoLabel, 0));
10275 std::string label = CGUIInfoLabel::GetLabel(param, INFO::DEFAULT_CONTEXT);
10276 StringUtils::ToLower(label);
10277 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_ICON, label, 1));
10279 else if (prop.name == "addonversion")
10281 int infoLabel = TranslateSingleString(param, listItemDependent);
10282 if (infoLabel > 0)
10283 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_VERSION, infoLabel, 0));
10284 std::string label = CGUIInfoLabel::GetLabel(param, INFO::DEFAULT_CONTEXT);
10285 StringUtils::ToLower(label);
10286 return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_VERSION, label, 1));
10288 else if (prop.name == "idletime")
10289 return AddMultiInfo(CGUIInfo(SYSTEM_IDLE_TIME, atoi(param.c_str())));
10290 else if (prop.name == "locale")
10292 if (param == "region")
10294 return SYSTEM_LOCALE_REGION;
10296 else if (param == "iso")
10298 return SYSTEM_LOCALE;
10302 if (prop.name == "alarmlessorequal" && prop.num_params() == 2)
10303 return AddMultiInfo(CGUIInfo(SYSTEM_ALARM_LESS_OR_EQUAL, prop.param(0), atoi(prop.param(1).c_str())));
10304 else if (prop.name == "date")
10306 if (prop.num_params() == 2)
10307 return AddMultiInfo(CGUIInfo(SYSTEM_DATE, StringUtils::DateStringToYYYYMMDD(prop.param(0)) % 10000, StringUtils::DateStringToYYYYMMDD(prop.param(1)) % 10000));
10308 else if (prop.num_params() == 1)
10310 int dateformat = StringUtils::DateStringToYYYYMMDD(prop.param(0));
10311 if (dateformat <= 0) // not concrete date
10312 return AddMultiInfo(CGUIInfo(SYSTEM_DATE, prop.param(0), -1));
10313 else
10314 return AddMultiInfo(CGUIInfo(SYSTEM_DATE, dateformat % 10000));
10316 return SYSTEM_DATE;
10318 else if (prop.name == "time")
10320 if (prop.num_params() == 0)
10321 return AddMultiInfo(CGUIInfo(SYSTEM_TIME, TIME_FORMAT_GUESS));
10322 if (prop.num_params() == 1)
10324 TIME_FORMAT timeFormat = TranslateTimeFormat(prop.param(0));
10325 if (timeFormat == TIME_FORMAT_GUESS)
10326 return AddMultiInfo(CGUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0))));
10327 return AddMultiInfo(CGUIInfo(SYSTEM_TIME, timeFormat));
10329 else
10330 return AddMultiInfo(CGUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0)), StringUtils::TimeStringToSeconds(prop.param(1))));
10333 else if (cat.name == "library")
10335 if (prop.name == "isscanning")
10336 return LIBRARY_IS_SCANNING;
10337 else if (prop.name == "isscanningvideo")
10338 return LIBRARY_IS_SCANNING_VIDEO; //! @todo change to IsScanning(Video)
10339 else if (prop.name == "isscanningmusic")
10340 return LIBRARY_IS_SCANNING_MUSIC;
10341 else if (prop.name == "hascontent" && prop.num_params())
10343 std::string cat = prop.param(0);
10344 StringUtils::ToLower(cat);
10345 if (cat == "music")
10346 return LIBRARY_HAS_MUSIC;
10347 else if (cat == "video")
10348 return LIBRARY_HAS_VIDEO;
10349 else if (cat == "movies")
10350 return LIBRARY_HAS_MOVIES;
10351 else if (cat == "tvshows")
10352 return LIBRARY_HAS_TVSHOWS;
10353 else if (cat == "musicvideos")
10354 return LIBRARY_HAS_MUSICVIDEOS;
10355 else if (cat == "moviesets")
10356 return LIBRARY_HAS_MOVIE_SETS;
10357 else if (cat == "singles")
10358 return LIBRARY_HAS_SINGLES;
10359 else if (cat == "compilations")
10360 return LIBRARY_HAS_COMPILATIONS;
10361 else if (cat == "boxsets")
10362 return LIBRARY_HAS_BOXSETS;
10363 else if (cat == "role" && prop.num_params() > 1)
10364 return AddMultiInfo(CGUIInfo(LIBRARY_HAS_ROLE, prop.param(1), 0));
10366 else if (prop.name == "hasnode" && prop.num_params())
10368 std::string node = prop.param(0);
10369 StringUtils::ToLower(node);
10370 return AddMultiInfo(CGUIInfo(LIBRARY_HAS_NODE, prop.param(), 0));
10373 else if (cat.name == "musicplayer")
10375 for (const infomap& player_time : player_times) //! @todo remove these, they're repeats
10377 if (prop.name == player_time.str)
10378 return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
10380 if (prop.name == "content" && prop.num_params())
10381 return AddMultiInfo(CGUIInfo(MUSICPLAYER_CONTENT, prop.param(), 0));
10382 else if (prop.name == "property")
10384 if (StringUtils::EqualsNoCase(prop.param(), "fanart_image"))
10385 return AddMultiInfo(CGUIInfo(PLAYER_ITEM_ART, "fanart"));
10387 return AddMultiInfo(CGUIInfo(MUSICPLAYER_PROPERTY, prop.param()));
10389 return TranslateMusicPlayerString(prop.name);
10391 else if (cat.name == "videoplayer")
10393 if (prop.name != "starttime") // player.starttime is semantically different from videoplayer.starttime which has its own implementation!
10395 for (const infomap& player_time : player_times) //! @todo remove these, they're repeats
10397 if (prop.name == player_time.str)
10398 return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
10401 if (prop.name == "content" && prop.num_params())
10403 return AddMultiInfo(CGUIInfo(VIDEOPLAYER_CONTENT, prop.param(), 0));
10405 if (prop.name == "uniqueid" && prop.num_params())
10407 return AddMultiInfo(CGUIInfo(VIDEOPLAYER_UNIQUEID, prop.param(), 0));
10409 if (prop.name == "art" && prop.num_params() > 0)
10411 return AddMultiInfo(CGUIInfo(VIDEOPLAYER_ART, prop.param(), 0));
10413 return TranslateVideoPlayerString(prop.name);
10415 else if (cat.name == "retroplayer")
10417 for (const infomap& i : retroplayer)
10419 if (prop.name == i.str)
10420 return i.val;
10423 else if (cat.name == "slideshow")
10425 for (const infomap& i : slideshow)
10427 if (prop.name == i.str)
10428 return i.val;
10431 else if (cat.name == "container")
10433 for (const infomap& i : mediacontainer) // these ones don't have or need an id
10435 if (prop.name == i.str)
10436 return i.val;
10438 int id = atoi(cat.param().c_str());
10439 for (const infomap& container_bool : container_bools) // these ones can have an id (but don't need to?)
10441 if (prop.name == container_bool.str)
10442 return id ? AddMultiInfo(CGUIInfo(container_bool.val, id)) : container_bool.val;
10444 for (const infomap& container_int : container_ints) // these ones can have an int param on the property
10446 if (prop.name == container_int.str)
10447 return AddMultiInfo(CGUIInfo(container_int.val, id, atoi(prop.param().c_str())));
10449 for (const infomap& i : container_str) // these ones have a string param on the property
10451 if (prop.name == i.str)
10452 return AddMultiInfo(CGUIInfo(i.val, id, prop.param()));
10454 if (prop.name == "sortdirection")
10456 SortOrder order = SortOrderNone;
10457 if (StringUtils::EqualsNoCase(prop.param(), "ascending"))
10458 order = SortOrderAscending;
10459 else if (StringUtils::EqualsNoCase(prop.param(), "descending"))
10460 order = SortOrderDescending;
10461 return AddMultiInfo(CGUIInfo(CONTAINER_SORT_DIRECTION, order));
10464 else if (cat.name == "listitem" ||
10465 cat.name == "listitemposition" ||
10466 cat.name == "listitemnowrap" ||
10467 cat.name == "listitemabsolute")
10469 int ret = TranslateListItem(cat, prop, 0, false);
10470 if (ret)
10471 listItemDependent = true;
10472 return ret;
10474 else if (cat.name == "visualisation")
10476 for (const infomap& i : visualisation)
10478 if (prop.name == i.str)
10479 return i.val;
10482 else if (cat.name == "fanart")
10484 for (const infomap& fanart_label : fanart_labels)
10486 if (prop.name == fanart_label.str)
10487 return fanart_label.val;
10490 else if (cat.name == "skin")
10492 for (const infomap& skin_label : skin_labels)
10494 if (prop.name == skin_label.str)
10495 return skin_label.val;
10497 if (prop.num_params())
10499 if (prop.name == "string")
10501 if (prop.num_params() == 2)
10502 return AddMultiInfo(CGUIInfo(SKIN_STRING_IS_EQUAL, CSkinSettings::GetInstance().TranslateString(prop.param(0)), prop.param(1)));
10503 else
10504 return AddMultiInfo(CGUIInfo(SKIN_STRING, CSkinSettings::GetInstance().TranslateString(prop.param(0))));
10506 else if (prop.name == "numeric")
10508 return AddMultiInfo(
10509 CGUIInfo(SKIN_INTEGER, CSkinSettings::GetInstance().TranslateString(prop.param(0))));
10511 else if (prop.name == "hassetting")
10512 return AddMultiInfo(CGUIInfo(SKIN_BOOL, CSkinSettings::GetInstance().TranslateBool(prop.param(0))));
10513 else if (prop.name == "hastheme")
10514 return AddMultiInfo(CGUIInfo(SKIN_HAS_THEME, prop.param(0)));
10515 else if (prop.name == "timerisrunning")
10516 return AddMultiInfo(CGUIInfo(SKIN_TIMER_IS_RUNNING, prop.param(0)));
10517 else if (prop.name == "timerelapsedsecs")
10518 return AddMultiInfo(CGUIInfo(SKIN_TIMER_ELAPSEDSECS, prop.param(0)));
10521 else if (cat.name == "window")
10523 if (prop.name == "property" && prop.num_params() == 1)
10524 { //! @todo this doesn't support foo.xml
10525 int winID = cat.param().empty() ? 0 : CWindowTranslator::TranslateWindow(cat.param());
10526 if (winID != WINDOW_INVALID)
10527 return AddMultiInfo(CGUIInfo(WINDOW_PROPERTY, winID, prop.param()));
10529 for (const infomap& window_bool : window_bools)
10531 if (prop.name == window_bool.str)
10532 { //! @todo The parameter for these should really be on the first not the second property
10533 if (prop.param().find("xml") != std::string::npos)
10534 return AddMultiInfo(CGUIInfo(window_bool.val, 0, prop.param()));
10535 int winID = prop.param().empty() ? WINDOW_INVALID : CWindowTranslator::TranslateWindow(prop.param());
10536 return AddMultiInfo(CGUIInfo(window_bool.val, winID, 0));
10540 else if (cat.name == "control")
10542 for (const infomap& control_label : control_labels)
10544 if (prop.name == control_label.str)
10545 { //! @todo The parameter for these should really be on the first not the second property
10546 int controlID = atoi(prop.param().c_str());
10547 if (controlID)
10548 return AddMultiInfo(CGUIInfo(control_label.val, controlID, 0));
10549 return 0;
10553 else if (cat.name == "controlgroup" && prop.name == "hasfocus")
10555 int groupID = atoi(cat.param().c_str());
10556 if (groupID)
10557 return AddMultiInfo(CGUIInfo(CONTROL_GROUP_HAS_FOCUS, groupID, atoi(prop.param(0).c_str())));
10559 else if (cat.name == "playlist")
10561 int ret = -1;
10562 for (const infomap& i : playlist)
10564 if (prop.name == i.str)
10566 ret = i.val;
10567 break;
10570 if (ret >= 0)
10572 if (prop.num_params() <= 0)
10573 return ret;
10574 else
10576 PLAYLIST::Id playlistid = PLAYLIST::Id::TYPE_NONE;
10577 if (StringUtils::EqualsNoCase(prop.param(), "video"))
10578 playlistid = PLAYLIST::Id::TYPE_VIDEO;
10579 else if (StringUtils::EqualsNoCase(prop.param(), "music"))
10580 playlistid = PLAYLIST::Id::TYPE_MUSIC;
10582 if (playlistid != PLAYLIST::Id::TYPE_NONE)
10583 return AddMultiInfo(CGUIInfo(ret, static_cast<int>(playlistid), 1));
10587 else if (cat.name == "pvr")
10589 for (const infomap& i : pvr)
10591 if (prop.name == i.str)
10592 return i.val;
10594 for (const infomap& pvr_time : pvr_times)
10596 if (prop.name == pvr_time.str)
10597 return AddMultiInfo(CGUIInfo(pvr_time.val, TranslateTimeFormat(prop.param())));
10600 else if (cat.name == "rds")
10602 if (prop.name == "getline")
10603 return AddMultiInfo(CGUIInfo(RDS_GET_RADIOTEXT_LINE, atoi(prop.param(0).c_str())));
10605 for (const infomap& rd : rds)
10607 if (prop.name == rd.str)
10608 return rd.val;
10612 else if (info.size() == 3 || info.size() == 4)
10614 if (info[0].name == "system" && info[1].name == "platform")
10615 { //! @todo replace with a single system.platform
10616 std::string platform = info[2].name;
10617 if (platform == "linux")
10618 return SYSTEM_PLATFORM_LINUX;
10619 else if (platform == "windows")
10620 return SYSTEM_PLATFORM_WINDOWS;
10621 else if (platform == "uwp")
10622 return SYSTEM_PLATFORM_UWP;
10623 else if (platform == "darwin")
10624 return SYSTEM_PLATFORM_DARWIN;
10625 else if (platform == "osx")
10626 return SYSTEM_PLATFORM_DARWIN_OSX;
10627 else if (platform == "ios")
10628 return SYSTEM_PLATFORM_DARWIN_IOS;
10629 else if (platform == "tvos")
10630 return SYSTEM_PLATFORM_DARWIN_TVOS;
10631 else if (platform == "android")
10632 return SYSTEM_PLATFORM_ANDROID;
10633 else if (platform == "webos")
10634 return SYSTEM_PLATFORM_WEBOS;
10636 if (info[0].name == "musicplayer")
10637 { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10638 if (info[1].name == "position")
10640 int position = atoi(info[1].param().c_str());
10641 int value = TranslateMusicPlayerString(info[2].name); // musicplayer.position(foo).bar
10642 return AddMultiInfo(CGUIInfo(value, 2, position)); // 2 => absolute (0 used for not set)
10644 else if (info[1].name == "offset")
10646 int position = atoi(info[1].param().c_str());
10647 int value = TranslateMusicPlayerString(info[2].name); // musicplayer.offset(foo).bar
10648 return AddMultiInfo(CGUIInfo(value, 1, position)); // 1 => relative
10651 else if (info[0].name == "videoplayer")
10652 { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10653 if (info[1].name == "position")
10655 int position = atoi(info[1].param().c_str());
10656 int value = TranslateVideoPlayerString(info[2].name); // videoplayer.position(foo).bar
10657 // additional param for the requested infolabel, e.g. VideoPlayer.Position(1).Art(poster): art is the value, poster is the param
10658 const std::string& param = info[2].param();
10659 return AddMultiInfo(
10660 CGUIInfo(value, 2, position, param)); // 2 => absolute (0 used for not set)
10662 else if (info[1].name == "offset")
10664 int position = atoi(info[1].param().c_str());
10665 int value = TranslateVideoPlayerString(info[2].name); // videoplayer.offset(foo).bar
10666 // additional param for the requested infolabel, e.g. VideoPlayer.Offset(1).Art(poster): art is the value, poster is the param
10667 const std::string& param = info[2].param();
10668 return AddMultiInfo(CGUIInfo(value, 1, position, param)); // 1 => relative
10671 else if (info[0].name == "player")
10672 { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10673 if (info[1].name == "position")
10675 int position = atoi(info[1].param().c_str());
10676 int value = TranslatePlayerString(info[2].name); // player.position(foo).bar
10677 return AddMultiInfo(CGUIInfo(value, 2, position)); // 2 => absolute (0 used for not set)
10679 else if (info[1].name == "offset")
10681 int position = atoi(info[1].param().c_str());
10682 int value = TranslatePlayerString(info[2].name); // player.offset(foo).bar
10683 return AddMultiInfo(CGUIInfo(value, 1, position)); // 1 => relative
10686 else if (info[0].name == "container")
10688 if (info[1].name == "listitem" ||
10689 info[1].name == "listitemposition" ||
10690 info[1].name == "listitemabsolute" ||
10691 info[1].name == "listitemnowrap")
10693 int id = atoi(info[0].param().c_str());
10694 int ret = TranslateListItem(info[1], info[2], id, true);
10695 if (ret)
10696 listItemDependent = true;
10697 return ret;
10700 else if (info[0].name == "control")
10702 const Property &prop = info[1];
10703 for (const infomap& control_label : control_labels)
10705 if (prop.name == control_label.str)
10706 { //! @todo The parameter for these should really be on the first not the second property
10707 int controlID = atoi(prop.param().c_str());
10708 if (controlID)
10709 return AddMultiInfo(CGUIInfo(control_label.val, controlID, atoi(info[2].param(0).c_str())));
10710 return 0;
10716 return 0;
10719 int CGUIInfoManager::TranslateListItem(const Property& cat, const Property& prop, int id, bool container)
10721 int ret = 0;
10722 std::string data3;
10723 int data4 = 0;
10724 if (prop.num_params() == 1)
10726 // special case: map 'property(fanart_image)' to 'art(fanart)'
10727 if (prop.name == "property" && StringUtils::EqualsNoCase(prop.param(), "fanart_image"))
10729 ret = LISTITEM_ART;
10730 data3 = "fanart";
10732 else if (prop.name == "property" ||
10733 prop.name == "art" ||
10734 prop.name == "rating" ||
10735 prop.name == "votes" ||
10736 prop.name == "ratingandvotes" ||
10737 prop.name == "uniqueid")
10739 data3 = prop.param();
10741 else if (prop.name == "duration" || prop.name == "nextduration")
10743 data4 = TranslateTimeFormat(prop.param());
10747 if (ret == 0)
10749 for (const infomap& listitem_label : listitem_labels) // these ones don't have or need an id
10751 if (prop.name == listitem_label.str)
10753 ret = listitem_label.val;
10754 break;
10759 if (ret)
10761 int offset = std::atoi(cat.param().c_str());
10763 int flags = 0;
10764 if (cat.name == "listitem")
10765 flags = INFOFLAG_LISTITEM_WRAP;
10766 else if (cat.name == "listitemposition")
10767 flags = INFOFLAG_LISTITEM_POSITION;
10768 else if (cat.name == "listitemabsolute")
10769 flags = INFOFLAG_LISTITEM_ABSOLUTE;
10770 else if (cat.name == "listitemnowrap")
10771 flags = INFOFLAG_LISTITEM_NOWRAP;
10773 if (container)
10774 flags |= INFOFLAG_LISTITEM_CONTAINER;
10776 return AddMultiInfo(CGUIInfo(ret, id, offset, flags, data3, data4));
10779 return 0;
10782 int CGUIInfoManager::TranslateMusicPlayerString(const std::string &info) const
10784 for (const infomap& i : musicplayer)
10786 if (info == i.str)
10787 return i.val;
10789 return 0;
10792 int CGUIInfoManager::TranslateVideoPlayerString(const std::string& info) const
10794 for (const infomap& i : videoplayer)
10796 if (info == i.str)
10797 return i.val;
10799 return 0;
10802 int CGUIInfoManager::TranslatePlayerString(const std::string& info) const
10804 for (const infomap& i : player_labels)
10806 if (info == i.str)
10807 return i.val;
10809 return 0;
10812 TIME_FORMAT CGUIInfoManager::TranslateTimeFormat(const std::string &format)
10814 if (format.empty())
10815 return TIME_FORMAT_GUESS;
10816 else if (StringUtils::EqualsNoCase(format, "hh"))
10817 return TIME_FORMAT_HH;
10818 else if (StringUtils::EqualsNoCase(format, "mm"))
10819 return TIME_FORMAT_MM;
10820 else if (StringUtils::EqualsNoCase(format, "ss"))
10821 return TIME_FORMAT_SS;
10822 else if (StringUtils::EqualsNoCase(format, "hh:mm"))
10823 return TIME_FORMAT_HH_MM;
10824 else if (StringUtils::EqualsNoCase(format, "mm:ss"))
10825 return TIME_FORMAT_MM_SS;
10826 else if (StringUtils::EqualsNoCase(format, "hh:mm:ss"))
10827 return TIME_FORMAT_HH_MM_SS;
10828 else if (StringUtils::EqualsNoCase(format, "hh:mm:ss xx"))
10829 return TIME_FORMAT_HH_MM_SS_XX;
10830 else if (StringUtils::EqualsNoCase(format, "h"))
10831 return TIME_FORMAT_H;
10832 else if (StringUtils::EqualsNoCase(format, "m"))
10833 return TIME_FORMAT_M;
10834 else if (StringUtils::EqualsNoCase(format, "h:mm:ss"))
10835 return TIME_FORMAT_H_MM_SS;
10836 else if (StringUtils::EqualsNoCase(format, "h:mm:ss xx"))
10837 return TIME_FORMAT_H_MM_SS_XX;
10838 else if (StringUtils::EqualsNoCase(format, "xx"))
10839 return TIME_FORMAT_XX;
10840 else if (StringUtils::EqualsNoCase(format, "secs"))
10841 return TIME_FORMAT_SECS;
10842 else if (StringUtils::EqualsNoCase(format, "mins"))
10843 return TIME_FORMAT_MINS;
10844 else if (StringUtils::EqualsNoCase(format, "hours"))
10845 return TIME_FORMAT_HOURS;
10846 return TIME_FORMAT_GUESS;
10849 std::string CGUIInfoManager::GetLabel(int info, int contextWindow, std::string *fallback) const
10851 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
10853 return GetSkinVariableString(info, contextWindow, false);
10855 else if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
10857 return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow);
10859 else if (info >= LISTITEM_START && info <= LISTITEM_END)
10861 const std::shared_ptr<CGUIListItem> item = GUIINFO::GetCurrentListItem(contextWindow);
10862 if (item && item->IsFileItem())
10863 return GetItemLabel(static_cast<CFileItem*>(item.get()), contextWindow, info, fallback);
10866 std::string strLabel;
10867 m_infoProviders.GetLabel(strLabel, m_currentFile, contextWindow, CGUIInfo(info), fallback);
10868 return strLabel;
10871 bool CGUIInfoManager::GetInt(int &value, int info, int contextWindow, const CGUIListItem *item /* = nullptr */) const
10873 if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
10875 return GetMultiInfoInt(value, m_multiInfo[info - MULTI_INFO_START], contextWindow, item);
10877 else if (info >= LISTITEM_START && info <= LISTITEM_END)
10879 std::shared_ptr<CGUIListItem> itemPtr;
10880 if (!item)
10882 itemPtr = GUIINFO::GetCurrentListItem(contextWindow);
10883 item = itemPtr.get();
10885 return GetItemInt(value, item, contextWindow, info);
10888 value = 0;
10889 return m_infoProviders.GetInt(value, m_currentFile, contextWindow, CGUIInfo(info));
10892 INFO::InfoPtr CGUIInfoManager::Register(const std::string &expression, int context)
10894 std::string condition(CGUIInfoLabel::ReplaceLocalize(expression));
10895 StringUtils::Trim(condition);
10897 if (condition.empty())
10898 return INFO::InfoPtr();
10900 std::unique_lock<CCriticalSection> lock(m_critInfo);
10901 std::pair<INFOBOOLTYPE::iterator, bool> res;
10903 if (condition.find_first_of("|+[]!") != condition.npos)
10904 res = m_bools.insert(std::make_shared<InfoExpression>(condition, context, m_refreshCounter));
10905 else
10906 res = m_bools.insert(std::make_shared<InfoSingle>(condition, context, m_refreshCounter));
10908 if (res.second)
10909 res.first->get()->Initialize(this);
10911 return *(res.first);
10914 void CGUIInfoManager::UnRegister(const INFO::InfoPtr& expression)
10916 std::unique_lock<CCriticalSection> lock(m_critInfo);
10917 m_bools.erase(expression);
10920 bool CGUIInfoManager::EvaluateBool(const std::string& expression,
10921 int contextWindow /* = 0 */,
10922 const std::shared_ptr<CGUIListItem>& item /* = nullptr */)
10924 INFO::InfoPtr info = Register(expression, contextWindow);
10925 if (info)
10926 return info->Get(contextWindow, item.get());
10927 return false;
10930 bool CGUIInfoManager::GetBool(int condition1, int contextWindow, const CGUIListItem *item)
10932 bool bReturn = false;
10933 int condition = std::abs(condition1);
10935 if (condition >= LISTITEM_START && condition < LISTITEM_END)
10937 std::shared_ptr<CGUIListItem> itemPtr;
10938 if (!item)
10940 itemPtr = GUIINFO::GetCurrentListItem(contextWindow);
10941 item = itemPtr.get();
10943 bReturn = GetItemBool(item, contextWindow, condition);
10945 else if (condition >= MULTI_INFO_START && condition <= MULTI_INFO_END)
10947 bReturn = GetMultiInfoBool(m_multiInfo[condition - MULTI_INFO_START], contextWindow, item);
10949 else if (!m_infoProviders.GetBool(bReturn, m_currentFile, contextWindow, CGUIInfo(condition)))
10951 // default: use integer value different from 0 as true
10952 int val;
10953 bReturn = GetInt(val, condition, DEFAULT_CONTEXT) && val != 0;
10956 return (condition1 < 0) ? !bReturn : bReturn;
10959 bool CGUIInfoManager::GetMultiInfoBool(const CGUIInfo &info, int contextWindow, const CGUIListItem *item)
10961 bool bReturn = false;
10962 int condition = std::abs(info.m_info);
10964 if (condition >= LISTITEM_START && condition <= LISTITEM_END)
10966 std::shared_ptr<CGUIListItem> itemPtr;
10967 if (!item)
10969 itemPtr = GUIINFO::GetCurrentListItem(contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
10970 item = itemPtr.get();
10972 if (item)
10974 if (condition == LISTITEM_PROPERTY)
10976 if (item->HasProperty(info.GetData3()))
10977 bReturn = item->GetProperty(info.GetData3()).asBoolean();
10979 else
10980 bReturn = GetItemBool(item, contextWindow, condition);
10982 else
10984 bReturn = false;
10987 else if (!m_infoProviders.GetBool(bReturn, m_currentFile, contextWindow, info))
10989 switch (condition)
10991 case STRING_IS_EMPTY:
10992 // note: Get*Image() falls back to Get*Label(), so this should cover all of them
10993 if (item && item->IsFileItem() && IsListItemInfo(info.GetData1()))
10994 bReturn = GetItemImage(item, contextWindow, info.GetData1()).empty();
10995 else
10996 bReturn = GetImage(info.GetData1(), contextWindow).empty();
10997 break;
10998 case STRING_STARTS_WITH:
10999 case STRING_ENDS_WITH:
11000 case STRING_CONTAINS:
11001 case STRING_IS_EQUAL:
11003 std::string compare;
11004 if (info.GetData2() < 0) // info labels are stored with negative numbers
11006 int info2 = -info.GetData2();
11007 std::shared_ptr<CGUIListItem> item2;
11009 if (IsListItemInfo(info2))
11011 int iResolvedInfo2 = ResolveMultiInfo(info2);
11012 if (iResolvedInfo2 != 0)
11014 const GUIINFO::CGUIInfo& resolvedInfo2 = m_multiInfo[iResolvedInfo2 - MULTI_INFO_START];
11015 if (resolvedInfo2.GetInfoFlag() & INFOFLAG_LISTITEM_CONTAINER)
11016 item2 = GUIINFO::GetCurrentListItem(contextWindow, resolvedInfo2.GetData1()); // data1 contains the container id
11020 if (item2 && item2->IsFileItem())
11021 compare = GetItemImage(item2.get(), contextWindow, info2);
11022 else if (item && item->IsFileItem())
11023 compare = GetItemImage(item, contextWindow, info2);
11024 else
11025 compare = GetImage(info2, contextWindow);
11027 else if (!info.GetData3().empty())
11028 { // conditional string
11029 compare = info.GetData3();
11031 StringUtils::ToLower(compare);
11033 std::string label;
11034 if (item && item->IsFileItem() && IsListItemInfo(info.GetData1()))
11035 label = GetItemImage(item, contextWindow, info.GetData1());
11036 else
11037 label = GetImage(info.GetData1(), contextWindow);
11038 StringUtils::ToLower(label);
11040 if (condition == STRING_STARTS_WITH)
11041 bReturn = StringUtils::StartsWith(label, compare);
11042 else if (condition == STRING_ENDS_WITH)
11043 bReturn = StringUtils::EndsWith(label, compare);
11044 else if (condition == STRING_CONTAINS)
11045 bReturn = label.find(compare) != std::string::npos;
11046 else
11047 bReturn = StringUtils::EqualsNoCase(label, compare);
11049 break;
11050 case INTEGER_IS_EQUAL:
11051 case INTEGER_GREATER_THAN:
11052 case INTEGER_GREATER_OR_EQUAL:
11053 case INTEGER_LESS_THAN:
11054 case INTEGER_LESS_OR_EQUAL:
11055 case INTEGER_EVEN:
11056 case INTEGER_ODD:
11058 auto getIntValue = [this, &item, &contextWindow](int infoNum) {
11059 int intValue = 0;
11060 if (!GetInt(intValue, infoNum, contextWindow, item))
11062 std::string value;
11063 if (item && item->IsFileItem() && IsListItemInfo(infoNum))
11064 value = GetItemImage(item, contextWindow, infoNum);
11065 else
11066 value = GetImage(infoNum, contextWindow);
11068 // Handle the case when a value contains time separator (:). This makes Integer.IsGreater
11069 // useful for Player.Time* members without adding a separate set of members returning time in seconds
11070 if (value.find_first_of(':') != value.npos)
11071 intValue = StringUtils::TimeStringToSeconds(value);
11072 else
11073 std::from_chars(value.data(), value.data() + value.size(), intValue);
11075 return intValue;
11078 int leftIntValue = getIntValue(info.GetData1());
11079 int rightIntValue = getIntValue(info.GetData2());
11081 // compare
11082 if (condition == INTEGER_IS_EQUAL)
11083 bReturn = leftIntValue == rightIntValue;
11084 else if (condition == INTEGER_GREATER_THAN)
11085 bReturn = leftIntValue > rightIntValue;
11086 else if (condition == INTEGER_GREATER_OR_EQUAL)
11087 bReturn = leftIntValue >= rightIntValue;
11088 else if (condition == INTEGER_LESS_THAN)
11089 bReturn = leftIntValue < rightIntValue;
11090 else if (condition == INTEGER_LESS_OR_EQUAL)
11091 bReturn = leftIntValue <= rightIntValue;
11092 else if (condition == INTEGER_EVEN)
11093 bReturn = leftIntValue % 2 == 0;
11094 else if (condition == INTEGER_ODD)
11095 bReturn = leftIntValue % 2 != 0;
11097 break;
11100 return (info.m_info < 0) ? !bReturn : bReturn;
11103 bool CGUIInfoManager::GetMultiInfoInt(int &value, const CGUIInfo &info, int contextWindow, const CGUIListItem *item) const
11105 if (info.m_info == INTEGER_VALUEOF)
11107 value = info.GetData1();
11108 return true;
11110 else if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
11112 std::shared_ptr<CGUIListItem> itemPtr;
11113 if (!item)
11115 itemPtr = GUIINFO::GetCurrentListItem(contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
11116 item = itemPtr.get();
11118 if (item)
11120 if (info.m_info == LISTITEM_PROPERTY)
11122 if (item->HasProperty(info.GetData3()))
11124 value = item->GetProperty(info.GetData3()).asInteger();
11125 return true;
11127 return false;
11129 else
11130 return GetItemInt(value, item, contextWindow, info.m_info);
11132 else
11134 return false;
11138 return m_infoProviders.GetInt(value, m_currentFile, contextWindow, info);
11141 std::string CGUIInfoManager::GetMultiInfoLabel(const CGUIInfo &constinfo, int contextWindow, std::string *fallback) const
11143 CGUIInfo info(constinfo);
11145 if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
11147 const std::shared_ptr<CGUIListItem> item = GUIINFO::GetCurrentListItem(
11148 contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
11149 if (item)
11151 // Image prioritizes images over labels (in the case of music item ratings for instance)
11152 return GetMultiInfoItemImage(dynamic_cast<CFileItem*>(item.get()), contextWindow, info, fallback);
11154 else
11156 return std::string();
11159 else if (info.m_info == SYSTEM_ADDON_TITLE ||
11160 info.m_info == SYSTEM_ADDON_ICON ||
11161 info.m_info == SYSTEM_ADDON_VERSION)
11163 if (info.GetData2() == 0)
11165 // resolve the addon id
11166 const std::string addonId = GetLabel(info.GetData1(), contextWindow);
11167 info = CGUIInfo(info.m_info, addonId);
11171 std::string strValue;
11172 m_infoProviders.GetLabel(strValue, m_currentFile, contextWindow, info, fallback);
11173 return strValue;
11176 /// \brief Obtains the filename of the image to show from whichever subsystem is needed
11177 std::string CGUIInfoManager::GetImage(int info, int contextWindow, std::string *fallback)
11179 if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
11181 return GetSkinVariableString(info, contextWindow, true);
11183 else if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
11185 return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow, fallback);
11187 else if (info == LISTITEM_THUMB ||
11188 info == LISTITEM_ICON ||
11189 info == LISTITEM_ACTUAL_ICON ||
11190 info == LISTITEM_OVERLAY ||
11191 info == LISTITEM_ART)
11193 const std::shared_ptr<CGUIListItem> item = GUIINFO::GetCurrentListItem(contextWindow);
11194 if (item && item->IsFileItem())
11195 return GetItemImage(item.get(), contextWindow, info, fallback);
11198 return GetLabel(info, contextWindow, fallback);
11201 void CGUIInfoManager::ResetCurrentItem()
11203 m_currentFile->Reset();
11204 m_infoProviders.InitCurrentItem(nullptr);
11207 void CGUIInfoManager::UpdateCurrentItem(const CFileItem &item)
11209 m_currentFile->UpdateInfo(item);
11212 void CGUIInfoManager::SetCurrentItem(const CFileItem &item)
11214 *m_currentFile = item;
11215 m_currentFile->FillInDefaultIcon();
11217 m_infoProviders.InitCurrentItem(m_currentFile);
11219 CServiceBroker::GetAnnouncementManager()->Announce(ANNOUNCEMENT::Info, "OnChanged");
11222 void CGUIInfoManager::SetCurrentAlbumThumb(const std::string &thumbFileName)
11224 if (CFileUtils::Exists(thumbFileName))
11225 m_currentFile->SetArt("thumb", thumbFileName);
11226 else
11228 m_currentFile->SetArt("thumb", "");
11229 m_currentFile->FillInDefaultIcon();
11233 void CGUIInfoManager::Clear()
11235 std::unique_lock<CCriticalSection> lock(m_critInfo);
11236 m_skinVariableStrings.clear();
11239 Erase any info bools that are unused. We do this repeatedly as each run
11240 will remove those bools that are no longer dependencies of other bools
11241 in the vector.
11243 INFOBOOLTYPE swapList(&InfoBoolComparator);
11246 swapList.clear();
11247 for (auto &item : m_bools)
11248 if (!item.unique())
11249 swapList.insert(item);
11250 m_bools.swap(swapList);
11251 } while (swapList.size() != m_bools.size());
11253 // log which ones are used - they should all be gone by now
11254 for (INFOBOOLTYPE::const_iterator i = m_bools.begin(); i != m_bools.end(); ++i)
11255 CLog::Log(LOGDEBUG, "Infobool '{}' still used by {} instances", (*i)->GetExpression(),
11256 (unsigned int)i->use_count());
11259 void CGUIInfoManager::UpdateAVInfo()
11261 if (CServiceBroker::GetDataCacheCore().HasAVInfoChanges())
11263 VideoStreamInfo video;
11264 AudioStreamInfo audio;
11265 SubtitleStreamInfo subtitle;
11267 auto& components = CServiceBroker::GetAppComponents();
11268 const auto appPlayer = components.GetComponent<CApplicationPlayer>();
11269 appPlayer->GetVideoStreamInfo(CURRENT_STREAM, video);
11270 appPlayer->GetAudioStreamInfo(CURRENT_STREAM, audio);
11271 appPlayer->GetSubtitleStreamInfo(CURRENT_STREAM, subtitle);
11273 m_infoProviders.UpdateAVInfo(audio, video, subtitle);
11277 int CGUIInfoManager::AddMultiInfo(const CGUIInfo &info)
11279 // check to see if we have this info already
11280 for (unsigned int i = 0; i < m_multiInfo.size(); ++i)
11281 if (m_multiInfo[i] == info)
11282 return static_cast<int>(i) + MULTI_INFO_START;
11283 // return the new offset
11284 m_multiInfo.emplace_back(info);
11285 int id = static_cast<int>(m_multiInfo.size()) + MULTI_INFO_START - 1;
11286 if (id > MULTI_INFO_END)
11287 CLog::Log(LOGERROR, "{} - too many multiinfo bool/labels in this skin", __FUNCTION__);
11288 return id;
11291 int CGUIInfoManager::ResolveMultiInfo(int info) const
11293 int iLastInfo = 0;
11295 int iResolvedInfo = info;
11296 while (iResolvedInfo >= MULTI_INFO_START && iResolvedInfo <= MULTI_INFO_END)
11298 iLastInfo = iResolvedInfo;
11299 iResolvedInfo = m_multiInfo[iResolvedInfo - MULTI_INFO_START].m_info;
11302 return iLastInfo;
11305 bool CGUIInfoManager::IsListItemInfo(int info) const
11307 int iResolvedInfo = info;
11308 while (iResolvedInfo >= MULTI_INFO_START && iResolvedInfo <= MULTI_INFO_END)
11309 iResolvedInfo = m_multiInfo[iResolvedInfo - MULTI_INFO_START].m_info;
11311 return (iResolvedInfo >= LISTITEM_START && iResolvedInfo <= LISTITEM_END);
11314 bool CGUIInfoManager::GetItemInt(int &value, const CGUIListItem *item, int contextWindow, int info) const
11316 value = 0;
11318 if (!item)
11319 return false;
11321 return m_infoProviders.GetInt(value, item, contextWindow, CGUIInfo(info));
11324 std::string CGUIInfoManager::GetItemLabel(const CFileItem *item, int contextWindow, int info, std::string *fallback /* = nullptr */) const
11326 return GetMultiInfoItemLabel(item, contextWindow, CGUIInfo(info), fallback);
11329 std::string CGUIInfoManager::GetMultiInfoItemLabel(const CFileItem *item, int contextWindow, const CGUIInfo &info, std::string *fallback /* = nullptr */) const
11331 if (!item)
11332 return std::string();
11334 std::string value;
11336 if (info.m_info >= CONDITIONAL_LABEL_START && info.m_info <= CONDITIONAL_LABEL_END)
11338 return GetSkinVariableString(info.m_info, contextWindow, false, item);
11340 else if (info.m_info >= MULTI_INFO_START && info.m_info <= MULTI_INFO_END)
11342 return GetMultiInfoItemLabel(item, contextWindow, m_multiInfo[info.m_info - MULTI_INFO_START], fallback);
11344 else if (!m_infoProviders.GetLabel(value, item, contextWindow, info, fallback))
11346 switch (info.m_info)
11348 case LISTITEM_PROPERTY:
11349 return item->GetProperty(info.GetData3()).asString();
11350 case LISTITEM_LABEL:
11351 return item->GetLabel();
11352 case LISTITEM_LABEL2:
11353 return item->GetLabel2();
11354 case LISTITEM_FILENAME:
11355 case LISTITEM_FILE_EXTENSION:
11356 case LISTITEM_FILENAME_NO_EXTENSION:
11358 std::string strFile = URIUtils::GetFileName(item->GetPath());
11359 if (info.m_info == LISTITEM_FILE_EXTENSION)
11361 std::string strExtension = URIUtils::GetExtension(strFile);
11362 return StringUtils::TrimLeft(strExtension, ".");
11364 else if (info.m_info == LISTITEM_FILENAME_NO_EXTENSION)
11366 URIUtils::RemoveExtension(strFile);
11368 return strFile;
11370 case LISTITEM_DATE:
11371 if (item->m_dateTime.IsValid())
11372 return item->m_dateTime.GetAsLocalizedDate();
11373 break;
11374 case LISTITEM_DATETIME:
11375 if (item->m_dateTime.IsValid())
11376 return item->m_dateTime.GetAsLocalizedDateTime();
11377 break;
11378 case LISTITEM_SIZE:
11379 if (!item->m_bIsFolder || item->m_dwSize)
11380 return StringUtils::SizeToString(item->m_dwSize);
11381 break;
11382 case LISTITEM_PROGRAM_COUNT:
11383 return std::to_string(item->m_iprogramCount);
11384 case LISTITEM_ACTUAL_ICON:
11385 return item->GetArt("icon");
11386 case LISTITEM_ICON:
11388 std::string strThumb = item->GetThumbHideIfUnwatched(item);
11389 if (strThumb.empty())
11390 strThumb = item->GetArt("icon");
11391 if (fallback)
11392 *fallback = item->GetArt("icon");
11393 return strThumb;
11395 case LISTITEM_ART:
11396 return item->GetArt(info.GetData3());
11397 case LISTITEM_OVERLAY:
11398 return item->GetOverlayImage();
11399 case LISTITEM_THUMB:
11400 return item->GetThumbHideIfUnwatched(item);
11401 case LISTITEM_FOLDERPATH:
11402 return CURL(item->GetPath()).GetWithoutUserDetails();
11403 case LISTITEM_FOLDERNAME:
11404 case LISTITEM_PATH:
11406 std::string path;
11407 URIUtils::GetParentPath(item->GetPath(), path);
11408 path = CURL(path).GetWithoutUserDetails();
11409 if (info.m_info == LISTITEM_FOLDERNAME)
11411 URIUtils::RemoveSlashAtEnd(path);
11412 path = URIUtils::GetFileName(path);
11414 return path;
11416 case LISTITEM_FILENAME_AND_PATH:
11418 std::string path = item->GetPath();
11419 path = CURL(path).GetWithoutUserDetails();
11420 return path;
11422 case LISTITEM_SORT_LETTER:
11424 std::string letter;
11425 std::wstring character(1, item->GetSortLabel()[0]);
11426 StringUtils::ToUpper(character);
11427 g_charsetConverter.wToUTF8(character, letter);
11428 return letter;
11430 case LISTITEM_STARTTIME:
11432 if (item->m_dateTime.IsValid())
11433 return item->m_dateTime.GetAsLocalizedTime("", false);
11434 break;
11436 case LISTITEM_STARTDATE:
11438 if (item->m_dateTime.IsValid())
11439 return item->m_dateTime.GetAsLocalizedDate(true);
11440 break;
11442 case LISTITEM_CURRENTITEM:
11443 return std::to_string(item->GetCurrentItem());
11447 return value;
11450 std::string CGUIInfoManager::GetItemImage(const CGUIListItem *item, int contextWindow, int info, std::string *fallback /*= nullptr*/) const
11452 if (!item || !item->IsFileItem())
11453 return std::string();
11455 return GetMultiInfoItemImage(static_cast<const CFileItem*>(item), contextWindow, CGUIInfo(info), fallback);
11458 std::string CGUIInfoManager::GetMultiInfoItemImage(const CFileItem *item, int contextWindow, const CGUIInfo &info, std::string *fallback /*= nullptr*/) const
11460 if (info.m_info >= CONDITIONAL_LABEL_START && info.m_info <= CONDITIONAL_LABEL_END)
11462 return GetSkinVariableString(info.m_info, contextWindow, true, item);
11464 else if (info.m_info >= MULTI_INFO_START && info.m_info <= MULTI_INFO_END)
11466 return GetMultiInfoItemImage(item, contextWindow, m_multiInfo[info.m_info - MULTI_INFO_START], fallback);
11469 return GetMultiInfoItemLabel(item, contextWindow, info, fallback);
11472 bool CGUIInfoManager::GetItemBool(const CGUIListItem *item, int contextWindow, int condition) const
11474 if (!item)
11475 return false;
11477 bool value = false;
11478 if (!m_infoProviders.GetBool(value, item, contextWindow, CGUIInfo(condition)))
11480 switch (condition)
11482 case LISTITEM_ISSELECTED:
11483 return item->IsSelected();
11484 case LISTITEM_IS_FOLDER:
11485 return item->m_bIsFolder;
11486 case LISTITEM_IS_PARENTFOLDER:
11488 if (item->IsFileItem())
11490 const CFileItem *pItem = static_cast<const CFileItem *>(item);
11491 return pItem->IsParentFolder();
11493 break;
11498 return value;
11501 void CGUIInfoManager::ResetCache()
11503 // mark our infobools as dirty
11504 std::unique_lock<CCriticalSection> lock(m_critInfo);
11505 ++m_refreshCounter;
11508 void CGUIInfoManager::SetCurrentVideoTag(const CVideoInfoTag &tag)
11510 m_currentFile->SetFromVideoInfoTag(tag);
11511 m_currentFile->SetStartOffset(0);
11514 void CGUIInfoManager::SetCurrentSongTag(const MUSIC_INFO::CMusicInfoTag &tag)
11516 m_currentFile->SetFromMusicInfoTag(tag);
11517 m_currentFile->SetStartOffset(0);
11520 const MUSIC_INFO::CMusicInfoTag* CGUIInfoManager::GetCurrentSongTag() const
11522 if (m_currentFile->HasMusicInfoTag())
11523 return m_currentFile->GetMusicInfoTag();
11525 return nullptr;
11528 const CVideoInfoTag* CGUIInfoManager::GetCurrentMovieTag() const
11530 if (m_currentFile->HasVideoInfoTag())
11531 return m_currentFile->GetVideoInfoTag();
11533 return nullptr;
11536 const KODI::GAME::CGameInfoTag* CGUIInfoManager::GetCurrentGameTag() const
11538 if (m_currentFile->HasGameInfoTag())
11539 return m_currentFile->GetGameInfoTag();
11541 return nullptr;
11544 int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString* info)
11546 if (!info)
11547 return 0;
11549 std::unique_lock<CCriticalSection> lock(m_critInfo);
11550 m_skinVariableStrings.emplace_back(*info);
11551 delete info;
11552 return CONDITIONAL_LABEL_START + m_skinVariableStrings.size() - 1;
11555 int CGUIInfoManager::TranslateSkinVariableString(const std::string& name, int context)
11557 for (std::vector<CSkinVariableString>::const_iterator it = m_skinVariableStrings.begin();
11558 it != m_skinVariableStrings.end(); ++it)
11560 if (StringUtils::EqualsNoCase(it->GetName(), name) && it->GetContext() == context)
11561 return it - m_skinVariableStrings.begin() + CONDITIONAL_LABEL_START;
11563 return 0;
11566 std::string CGUIInfoManager::GetSkinVariableString(int info,
11567 int contextWindow,
11568 bool preferImage /*= false*/,
11569 const CGUIListItem* item /*= nullptr*/) const
11571 info -= CONDITIONAL_LABEL_START;
11572 if (info >= 0 && info < static_cast<int>(m_skinVariableStrings.size()))
11573 return m_skinVariableStrings[info].GetValue(contextWindow, preferImage, item);
11575 return "";
11578 bool CGUIInfoManager::ConditionsChangedValues(const std::map<INFO::InfoPtr, bool>& map)
11580 for (std::map<INFO::InfoPtr, bool>::const_iterator it = map.begin() ; it != map.end() ; ++it)
11582 if (it->first->Get(INFO::DEFAULT_CONTEXT) != it->second)
11583 return true;
11585 return false;
11588 int CGUIInfoManager::GetMessageMask()
11590 return TMSG_MASK_GUIINFOMANAGER;
11593 void CGUIInfoManager::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg)
11595 switch (pMsg->dwMessage)
11597 case TMSG_GUI_INFOLABEL:
11599 if (pMsg->lpVoid)
11601 auto infoLabels = static_cast<std::vector<std::string>*>(pMsg->lpVoid);
11602 for (auto& param : pMsg->params)
11603 infoLabels->emplace_back(GetLabel(TranslateString(param), DEFAULT_CONTEXT));
11606 break;
11608 case TMSG_GUI_INFOBOOL:
11610 if (pMsg->lpVoid)
11612 auto infoLabels = static_cast<std::vector<bool>*>(pMsg->lpVoid);
11613 for (auto& param : pMsg->params)
11614 infoLabels->push_back(EvaluateBool(param, DEFAULT_CONTEXT));
11617 break;
11619 case TMSG_UPDATE_CURRENT_ITEM:
11621 CFileItem* item = static_cast<CFileItem*>(pMsg->lpVoid);
11622 if (!item)
11623 return;
11625 if (pMsg->param1 == 1 && item->HasMusicInfoTag()) // only grab music tag
11626 SetCurrentSongTag(*item->GetMusicInfoTag());
11627 else if (pMsg->param1 == 2 && item->HasVideoInfoTag()) // only grab video tag
11628 SetCurrentVideoTag(*item->GetVideoInfoTag());
11629 else
11630 SetCurrentItem(*item);
11632 delete item;
11634 break;
11636 default:
11637 break;
11641 void CGUIInfoManager::RegisterInfoProvider(IGUIInfoProvider *provider)
11643 if (!CServiceBroker::GetWinSystem())
11644 return;
11646 std::unique_lock<CCriticalSection> lock(CServiceBroker::GetWinSystem()->GetGfxContext());
11648 m_infoProviders.RegisterProvider(provider, false);
11651 void CGUIInfoManager::UnregisterInfoProvider(IGUIInfoProvider *provider)
11653 if (!CServiceBroker::GetWinSystem())
11654 return;
11656 std::unique_lock<CCriticalSection> lock(CServiceBroker::GetWinSystem()->GetGfxContext());
11658 m_infoProviders.UnregisterProvider(provider);