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.
9 #include "GUIInfoManager.h"
12 #include "ServiceBroker.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"
45 using namespace KODI::GUILIB
;
46 using namespace KODI::GUILIB::GUIINFO
;
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)
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
);
87 /// \page modules__infolabels_boolean_conditions Infolabels and Boolean conditions
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>.
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>.
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
111 /// \table_h3{ Labels, Type, Description }
112 /// \table_row3{ <b>`true`</b>,
113 /// \anchor Global_True
115 /// @return Always evaluates to **true**.
118 /// \table_row3{ <b>`false`</b>,
119 /// \anchor Global_False
121 /// @return Always evaluates to **false**.
124 /// \table_row3{ <b>`yes`</b>,
125 /// \anchor Global_Yes
127 /// @return same as \link Global_True `true` \endlink.
130 /// \table_row3{ <b>`no`</b>,
131 /// \anchor Global_No
133 /// @return same as \link Global_False `false` \endlink.
138 /// -----------------------------------------------------------------------------
140 /// \page modules__infolabels_boolean_conditions
141 /// \subsection modules__infolabels_boolean_conditions_Addon Addon
143 /// \table_h3{ Labels, Type, Description }
144 /// \table_row3{ <b>`Addon.SettingStr(addon_id\,setting_id)`</b>,
145 /// \anchor Addon_SettingString
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
151 /// @skinning_v20 **[New Infolabel]** \link Addon_SettingString `Addon.SettingStr(addon_id\,setting_id)`\endlink
154 /// \table_row3{ <b>`Addon.SettingBool(addon_id\,setting_id)`</b>,
155 /// \anchor Addon_SettingBool
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
163 /// @skinning_v20 **[New Boolean Condition]** \link Addon_SettingBool `Addon.SettingBool(addon_id\,setting_id)`\endlink
166 /// \table_row3{ <b>`Addon.SettingInt(addon_id\,setting_id)`</b>,
167 /// \anchor Addon_SettingInt
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
175 /// @skinning_v20 **[New Integer Info]** \link Addon_SettingInt `Addon.SettingInt(addon_id\,setting_id)`\endlink
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
190 /// \table_h3{ Labels, Type, Description }
191 /// \table_row3{ <b>`String.IsEmpty(info)`</b>,
192 /// \anchor String_IsEmpty
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
201 /// @skinning_v17 **[New Boolean Condition]** \link String_IsEmpty `String.IsEmpty(info)`\endlink
204 /// \table_row3{ <b>`String.IsEqual(info\,string)`</b>,
205 /// \anchor String_IsEqual
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
215 /// @skinning_v17 **[New Boolean Condition]** \link String_IsEqual `String.IsEqual(info\,string)`\endlink
218 /// \table_row3{ <b>`String.StartsWith(info\,substring)`</b>,
219 /// \anchor String_StartsWith
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
229 /// @skinning_v17 **[New Boolean Condition]** \link String_StartsWith `String.StartsWith(info\,substring)`\endlink
232 /// \table_row3{ <b>`String.EndsWith(info\,substring)`</b>,
233 /// \anchor String_EndsWith
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
243 /// @skinning_v17 **[New Boolean Condition]** \link String_EndsWith `String.EndsWith(info\,substring)`\endlink
246 /// \table_row3{ <b>`String.Contains(info\,substring)`</b>,
247 /// \anchor String_Contains
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
257 /// @skinning_v17 **[New Boolean Condition]** \link String_Contains `String.Contains(info\,substring)`\endlink
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
274 /// \table_h3{ Labels, Type, Description }
275 /// \table_row3{ <b>`Integer.ValueOf(number)`</b>,
276 /// \anchor Integer_ValueOf
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.
284 /// @skinning_v20 **[New InfoLabel]** \link Integer_ValueOf `Integer.ValueOf(number)`\endlink
287 /// \table_row3{ <b>`Integer.IsEqual(info\,number)`</b>,
288 /// \anchor Integer_IsEqual
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)`
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.
300 /// \table_row3{ <b>`Integer.IsGreater(info\,number)`</b>,
301 /// \anchor Integer_IsGreater
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)`
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.
313 /// \table_row3{ <b>`Integer.IsGreaterOrEqual(info\,number)`</b>,
314 /// \anchor Integer_IsGreaterOrEqual
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)`
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.
327 /// \table_row3{ <b>`Integer.IsLess(info\,number)`</b>,
328 /// \anchor Integer_IsLess
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)`
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.
340 /// \table_row3{ <b>`Integer.IsLessOrEqual(info\,number)`</b>,
341 /// \anchor Integer_IsLessOrEqual
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)`
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.
353 /// \table_row3{ <b>`Integer.IsEven(info)`</b>,
354 /// \anchor Integer_IsEven
356 /// @return **True** if the value of the infolabel is odd
357 /// @param info - infolabel
358 /// @note **Example:** `Integer.IsEven(ListItem.CurrentItem)`
360 /// @skinning_v19 **[New Boolean Condition]** \link Integer_IsEven `Integer.IsEven(info)`\endlink
363 /// \table_row3{ <b>`Integer.IsOdd(info)`</b>,
364 /// \anchor Integer_IsOdd
366 /// @return **True** if the value of the infolabel is odd
367 /// @param info - infolabel
368 /// @note **Example:** `Integer.IsOdd(ListItem.CurrentItem)`
370 /// @skinning_v19 **[New Boolean Condition]** \link Integer_IsOdd `Integer.IsOdd(info)`\endlink
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
388 /// \table_h3{ Labels, Type, Description }
389 /// \table_row3{ <b>`Player.HasAudio`</b>,
390 /// \anchor Player_HasAudio
392 /// @return **True** if the player has an audio file.
395 /// \table_row3{ <b>`Player.HasGame`</b>,
396 /// \anchor Player_HasGame
398 /// @return **True** if the player has a game file (RETROPLAYER).
400 /// @skinning_v18 **[New Boolean Condition]** \link Player_HasGame `Player.HasGame`\endlink
403 /// \table_row3{ <b>`Player.HasMedia`</b>,
404 /// \anchor Player_HasMedia
406 /// @return **True** if the player has an audio or video file.
409 /// \table_row3{ <b>`Player.HasVideo`</b>,
410 /// \anchor Player_HasVideo
412 /// @return **True** if the player has a video file.
415 /// \table_row3{ <b>`Player.Paused`</b>,
416 /// \anchor Player_Paused
418 /// @return **True** if the player is paused.
421 /// \table_row3{ <b>`Player.Playing`</b>,
422 /// \anchor Player_Playing
424 /// @return **True** if the player is currently playing (i.e. not ffwding\,
425 /// rewinding or paused.)
428 /// \table_row3{ <b>`Player.Rewinding`</b>,
429 /// \anchor Player_Rewinding
431 /// @return **True** if the player is rewinding.
434 /// \table_row3{ <b>`Player.Rewinding2x`</b>,
435 /// \anchor Player_Rewinding2x
437 /// @return **True** if the player is rewinding at 2x.
440 /// \table_row3{ <b>`Player.Rewinding4x`</b>,
441 /// \anchor Player_Rewinding4x
443 /// @return **True** if the player is rewinding at 4x.
446 /// \table_row3{ <b>`Player.Rewinding8x`</b>,
447 /// \anchor Player_Rewinding8x
449 /// @return **True** if the player is rewinding at 8x.
452 /// \table_row3{ <b>`Player.Rewinding16x`</b>,
453 /// \anchor Player_Rewinding16x
455 /// @return **True** if the player is rewinding at 16x.
458 /// \table_row3{ <b>`Player.Rewinding32x`</b>,
459 /// \anchor Player_Rewinding32x
461 /// @return **True** if the player is rewinding at 32x.
464 /// \table_row3{ <b>`Player.Forwarding`</b>,
465 /// \anchor Player_Forwarding
467 /// @return **True** if the player is fast forwarding.
470 /// \table_row3{ <b>`Player.Forwarding2x`</b>,
471 /// \anchor Player_Forwarding2x
473 /// @return **True** if the player is fast forwarding at 2x.
476 /// \table_row3{ <b>`Player.Forwarding4x`</b>,
477 /// \anchor Player_Forwarding4x
479 /// @return **True** if the player is fast forwarding at 4x.
482 /// \table_row3{ <b>`Player.Forwarding8x`</b>,
483 /// \anchor Player_Forwarding8x
485 /// @return **True** if the player is fast forwarding at 8x.
488 /// \table_row3{ <b>`Player.Forwarding16x`</b>,
489 /// \anchor Player_Forwarding16x
491 /// @return **True** if the player is fast forwarding at 16x.
494 /// \table_row3{ <b>`Player.Forwarding32x`</b>,
495 /// \anchor Player_Forwarding32x
497 /// @return **True** if the player is fast forwarding at 32x.
500 /// \table_row3{ <b>`Player.Caching`</b>,
501 /// \anchor Player_Caching
503 /// @return **True** if the player is current re-caching data (internet based
507 /// \table_row3{ <b>`Player.DisplayAfterSeek`</b>,
508 /// \anchor Player_DisplayAfterSeek
510 /// @return **True** for the first 2.5 seconds after a seek.
513 /// \table_row3{ <b>`Player.Seekbar`</b>,
514 /// \anchor Player_Seekbar
516 /// @return The percentage of one seek to other position.
519 /// \table_row3{ <b>`Player.Seeking`</b>,
520 /// \anchor Player_Seeking
522 /// @return **True** if a seek is in progress.
525 /// \table_row3{ <b>`Player.ShowTime`</b>,
526 /// \anchor Player_ShowTime
528 /// @return **True** if the user has requested the time to show (occurs in video
532 /// \table_row3{ <b>`Player.ShowInfo`</b>,
533 /// \anchor Player_ShowInfo
535 /// @return **True** if the user has requested the song info to show (occurs in
536 /// visualisation fullscreen and slideshow).
539 /// \table_row3{ <b>`Player.Title`</b>,
540 /// \anchor Player_Title
542 /// @return The Musicplayer title for audio and the Videoplayer title for
546 /// \table_row3{ <b>`Player.offset(number).Title`</b>,
547 /// \anchor Player_Offset_Title
549 /// @return The title of audio or video which has an offset `number` with respect to the currently playing item.
551 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Title `Player.offset(number).Title`\endlink
554 /// \table_row3{ <b>`Player.position(number).Title`</b>,
555 /// \anchor Player_Position_Title
557 /// @return The title of the audio or video which has an offset `number` with respect to the start of the playlist.
559 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Title `Player.position(number).Title`\endlink
562 /// \table_row3{ <b>`Player.Muted`</b>,
563 /// \anchor Player_Muted
565 /// @return **True** if the volume is muted.
568 /// \table_row3{ <b>`Player.HasDuration`</b>,
569 /// \anchor Player_HasDuration
571 /// @return **True** if Media is not a true stream.
574 /// \table_row3{ <b>`Player.Passthrough`</b>,
575 /// \anchor Player_Passthrough
577 /// @return **True** if the player is using audio passthrough.
580 /// \table_row3{ <b>`Player.CacheLevel`</b>,
581 /// \anchor Player_CacheLevel
583 /// @return The used cache level as a string with an integer number.
586 /// \table_row3{ <b>`Player.Progress`</b>,
587 /// \anchor Player_Progress
588 /// _integer_ / _string_,
589 /// @return The progress position as percentage.
591 /// @skinning_v19 \link Player_Progress `Player.Progress`\endlink infolabel
592 /// also exposed as a string.
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
600 /// @skinning_v19 \link Player_ProgressCache `Player.ProgressCache`\endlink
601 /// infolabel also exposed as a string.
604 /// \table_row3{ <b>`Player.Volume`</b>,
605 /// \anchor Player_Volume
607 /// @return The current player volume with the format `%2.1f` dB
610 /// \table_row3{ <b>`Player.SubtitleDelay`</b>,
611 /// \anchor Player_SubtitleDelay
613 /// @return The used subtitle delay with the format `%2.3f` s
616 /// \table_row3{ <b>`Player.AudioDelay`</b>,
617 /// \anchor Player_AudioDelay
619 /// @return The used audio delay with the format `%2.3f` s
622 /// \table_row3{ <b>`Player.Chapter`</b>,
623 /// \anchor Player_Chapter
625 /// @return The current chapter of current playing media.
628 /// \table_row3{ <b>`Player.ChapterCount`</b>,
629 /// \anchor Player_ChapterCount
631 /// @return The total number of chapters of current playing media.
634 /// \table_row3{ <b>`Player.ChapterName`</b>,
635 /// \anchor Player_ChapterName
637 /// @return The name of currently used chapter if available.
640 /// \table_row3{ <b>`Player.Folderpath`</b>,
641 /// \anchor Player_Folderpath
643 /// @return The full path of the currently playing song or movie
646 /// \table_row3{ <b>`Player.offset(number).Folderpath`</b>,
647 /// \anchor Player_Offset_Folderpath
649 /// @return The full path of the audio or video file which has an offset `number` with respect to the currently playing item.
651 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Folderpath `Player.offset(number).Folderpath`\endlink
654 /// \table_row3{ <b>`Player.position(number).Folderpath`</b>,
655 /// \anchor Player_Position_Folderpath
657 /// @return The full path of the audio or video file which has an offset `number` with respect to the start of the playlist.
659 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Folderpath `Player.position(number).Folderpath`\endlink
662 /// \table_row3{ <b>`Player.FilenameAndPath`</b>,
663 /// \anchor Player_FilenameAndPath
665 /// @return The full path with filename of the currently
666 /// playing song or movie
669 /// \table_row3{ <b>`Player.offset(number).FilenameAndPath`</b>,
670 /// \anchor Player_Offset_FilenameAndPath
672 /// @return The full path with filename of audio or video file which has an offset `number` with respect to the currently playing item.
674 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_FilenameAndPath `Player.offset(number).FilenameAndPath`\endlink
677 /// \table_row3{ <b>`Player.position(number).FilenameAndPath`</b>,
678 /// \anchor Player_Position_FilenameAndPath
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.
682 /// @skinning_v19 **[New Infolabel]** \link Player_Position_FilenameAndPath `Player.position(number).FilenameAndPath`\endlink
685 /// \table_row3{ <b>`Player.Filename`</b>,
686 /// \anchor Player_Filename
688 /// @return The filename of the currently playing media.
690 /// @skinning_v13 **[New Infolabel]** \link Player_Filename `Player.Filename`\endlink
693 /// \table_row3{ <b>`Player.offset(number).Filename`</b>,
694 /// \anchor Player_Offset_Filename
696 /// @return The filename of audio or video file which has an offset `number` with respect to the currently playing item.
698 /// @skinning_v19 **[New Infolabel]** \link Player_Offset_Filename `Player.offset(number).Filename`\endlink
701 /// \table_row3{ <b>`Player.position(number).Filename`</b>,
702 /// \anchor Player_Position_Filename
704 /// @return The filename of the audio or video file which has an offset `number` with respect to the start of the playlist.
706 /// @skinning_v19 **[New Infolabel]** \link Player_Position_Filename `Player.position(number).Filename`\endlink
709 /// \table_row3{ <b>`Player.IsInternetStream`</b>,
710 /// \anchor Player_IsInternetStream
712 /// @return **True** if the player is playing an internet stream.
715 /// \table_row3{ <b>`Player.PauseEnabled`</b>,
716 /// \anchor Player_PauseEnabled
718 /// @return **True** if played stream is paused.
721 /// \table_row3{ <b>`Player.SeekEnabled`</b>,
722 /// \anchor Player_SeekEnabled
724 /// @return **True** if seek on playing is enabled.
727 /// \table_row3{ <b>`Player.ChannelPreviewActive`</b>,
728 /// \anchor Player_ChannelPreviewActive
730 /// @return **True** if PVR channel preview is active (used
731 /// channel tag different from played tag)
734 /// \table_row3{ <b>`Player.TempoEnabled`</b>,
735 /// \anchor Player_TempoEnabled
737 /// @return **True** if player supports tempo (i.e. speed up/down normal
740 /// @skinning_v17 **[New Boolean Condition]** \link Player_TempoEnabled `Player.TempoEnabled`\endlink
743 /// \table_row3{ <b>`Player.IsTempo`</b>,
744 /// \anchor Player_IsTempo
746 /// @return **True** if player has tempo (i.e. is playing with a playback speed higher or
747 /// lower than normal playback speed)
749 /// @skinning_v17 **[New Boolean Condition]** \link Player_IsTempo `Player.IsTempo`\endlink
752 /// \table_row3{ <b>`Player.PlaySpeed`</b>,
753 /// \anchor Player_PlaySpeed
755 /// @return The player playback speed with the format `%1.2f` (1.00 means normal
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.
762 /// \table_row3{ <b>`Player.HasResolutions`</b>,
763 /// \anchor Player_HasResolutions
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)
768 /// @skinning_v18 **[New Boolean Condition]** \link Player_HasResolutions `Player.HasResolutions`\endlink
771 /// \table_row3{ <b>`Player.HasPrograms`</b>,
772 /// \anchor Player_HasPrograms
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.
779 /// \table_row3{ <b>`Player.FrameAdvance`</b>,
780 /// \anchor Player_FrameAdvance
782 /// @return **True** if player is in frame advance mode.
783 /// @note Skins should hide seek bar in this mode
785 /// @skinning_v18 **[New Boolean Condition]** \link Player_FrameAdvance `Player.FrameAdvance`\endlink
788 /// \table_row3{ <b>`Player.Icon`</b>,
789 /// \anchor Player_Icon
791 /// @return The thumbnail of the currently playing item. If no thumbnail image exists\,
792 /// the icon will be returned\, if available.
794 /// @skinning_v18 **[New Infolabel]** \link Player_Icon `Player.Icon`\endlink
797 /// \table_row3{ <b>`Player.Editlist`</b>,
798 /// \anchor Player_Editlist
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.
805 /// @skinning_v20 **[New Infolabel]** \link Player_Editlist `Player.Editlist`\endlink
808 /// \table_row3{ <b>`Player.Cuts`</b>,
809 /// \anchor Player_Cuts
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.
814 /// @skinning_v20 **[New Infolabel]** \link Player_Cuts `Player.Cuts`\endlink
817 /// \table_row3{ <b>`Player.SceneMarkers`</b>,
818 /// \anchor Player_SceneMarkers
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.
823 /// @skinning_v20 **[New Infolabel]** \link Player_SceneMarkers `Player.SceneMarkers`\endlink
826 /// \table_row3{ <b>`Player.HasSceneMarkers`</b>,
827 /// \anchor Player_HasSceneMarkers
829 /// @return **True** if the item being played has scene markers\, **False** otherwise
831 /// @skinning_v20 **[New Infolabel]** \link Player_HasSceneMarkers `Player.HasSceneMarkers`\endlink
834 /// \table_row3{ <b>`Player.Chapters`</b>,
835 /// \anchor Player_Chapters
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.
840 /// @skinning_v19 **[New Infolabel]** \link Player_Chapters `Player.Chapters`\endlink
843 /// \table_row3{ <b>`Player.IsExternal`</b>,
844 /// \anchor Player_IsExternal
846 /// @return **True** if the playing player is an external player\, **False** otherwise
848 /// @skinning_v21 **[New Boolean Condition]** \link Player_IsExternal `Player.IsExternal`\endlink
851 /// \table_row3{ <b>`Player.IsRemote`</b>,
852 /// \anchor Player_IsRemote
854 /// @return **True** if the playing player is a remote player (e.g. UPnP)\, **False** otherwise
856 /// @skinning_v21 **[New Boolean Condition]** \link Player_IsRemote `Player.IsRemote`\endlink
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
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:
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.
936 /// \table_row3{ <b>`Player.HasPerformedSeek(interval)`</b>,
937 /// \anchor Player_HasPerformedSeek
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)
942 /// @skinning_v20 **[New Boolean Condition]** \link Player_HasPerformedSeek `Player.HasPerformedSeek(interval)`\endlink
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
953 /// @return The time to which the user is seeking.
956 /// \table_row3{ <b>`Player.SeekOffset([format])`</b>,
957 /// \anchor Player_SeekOffset_format
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.
963 /// @note **Example:** user presses BigStepForward\, player.seekoffset returns +10:00
966 /// \table_row3{ <b>`Player.SeekStepSize`</b>,
967 /// \anchor Player_SeekStepSize
969 /// @return The seek step size.
972 /// @skinning_v15 **[New Infolabel]** \link Player_SeekStepSize `Player.SeekStepSize`\endlink
975 /// \table_row3{ <b>`Player.TimeRemaining([format])`</b>,
976 /// \anchor Player_TimeRemaining_format
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.
983 /// \table_row3{ <b>`Player.TimeSpeed`</b>,
984 /// \anchor Player_TimeSpeed
986 /// @return The time and the playspeed formatted: "1:23 (2x)".
989 /// \table_row3{ <b>`Player.Time([format])`</b>,
990 /// \anchor Player_Time_format
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.
997 /// \table_row3{ <b>`Player.Duration([format])`</b>,
998 /// \anchor Player_Duration_format
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.
1005 /// \table_row3{ <b>`Player.FinishTime([format])`</b>,
1006 /// \anchor Player_FinishTime_format
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.
1013 /// \table_row3{ <b>`Player.StartTime([format])`</b>,
1014 /// \anchor Player_StartTime_format
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.
1021 /// \table_row3{ <b>`Player.SeekNumeric([format])`</b>,
1022 /// \anchor Player_SeekNumeric_format
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.
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
1045 /// @return **True** if the currently playing video is decoded in hardware.
1047 /// @skinning_v17 **[New Boolean Condition]** \link Player_Process_videohwdecoder `Player.Process(videohwdecoder)`\endlink
1050 /// \table_row3{ <b>`Player.Process(videodecoder)`</b>,
1051 /// \anchor Player_Process_videodecoder
1053 /// @return The videodecoder name of the currently playing video.
1055 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodecoder `Player.Process(videodecoder)`\endlink
1058 /// \table_row3{ <b>`Player.Process(deintmethod)`</b>,
1059 /// \anchor Player_Process_deintmethod
1061 /// @return The deinterlace method of the currently playing video.
1063 /// @skinning_v17 **[New Infolabel]** \link Player_Process_deintmethod `Player.Process(deintmethod)`\endlink
1066 /// \table_row3{ <b>`Player.Process(pixformat)`</b>,
1067 /// \anchor Player_Process_pixformat
1069 /// @return The pixel format of the currently playing video.
1071 /// @skinning_v17 **[New Infolabel]** \link Player_Process_pixformat `Player.Process(pixformat)`\endlink
1074 /// \table_row3{ <b>`Player.Process(videowidth)`</b>,
1075 /// \anchor Player_Process_videowidth
1077 /// @return The width of the currently playing video.
1079 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videowidth `Player.Process(videowidth)`\endlink
1082 /// \table_row3{ <b>`Player.Process(videoheight)`</b>,
1083 /// \anchor Player_Process_videoheight
1085 /// @return The width of the currently playing video.
1087 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videoheight `Player.Process(videoheight)`\endlink
1090 /// \table_row3{ <b>`Player.Process(videoscantype)`</b>,
1091 /// \anchor Player_Process_videoscantype
1093 /// @return The scan type identifier of the currently playing video **p** (for progressive) or **i** (for interlaced).
1095 /// @skinning_v20 **[New Infolabel]** \link Player_Process_videoscantype `Player.Process(videoscantype)`\endlink
1098 /// \table_row3{ <b>`Player.Process(videofps)`</b>,
1099 /// \anchor Player_Process_videofps
1101 /// @return The video framerate of the currently playing video.
1103 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videofps `Player.Process(videofps)`\endlink
1106 /// \table_row3{ <b>`Player.Process(videodar)`</b>,
1107 /// \anchor Player_Process_videodar
1109 /// @return The display aspect ratio of the currently playing video.
1111 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(videodar)`\endlink
1114 /// \table_row3{ <b>`Player.Process(audiodecoder)`</b>,
1115 /// \anchor Player_Process_audiodecoder
1117 /// @return The audiodecoder name of the currently playing item.
1119 /// @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(audiodecoder)`\endlink
1122 /// \table_row3{ <b>`Player.Process(audiochannels)`</b>,
1123 /// \anchor Player_Process_audiochannels
1125 /// @return The audiodecoder name of the currently playing item.
1127 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiochannels `Player.Process(audiochannels)`\endlink
1130 /// \table_row3{ <b>`Player.Process(audiosamplerate)`</b>,
1131 /// \anchor Player_Process_audiosamplerate
1133 /// @return The samplerate of the currently playing item.
1135 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiosamplerate `Player.Process(audiosamplerate)`\endlink
1138 /// \table_row3{ <b>`Player.Process(audiobitspersample)`</b>,
1139 /// \anchor Player_Process_audiobitspersample
1141 /// @return The bits per sample of the currently playing item.
1143 /// @skinning_v17 **[New Infolabel]** \link Player_Process_audiobitspersample `Player.Process(audiobitspersample)`\endlink
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
1167 /// \table_h3{ Labels, Type, Description }
1168 /// \table_row3{ <b>`Weather.IsFetched`</b>,
1169 /// \anchor Weather_IsFetched
1171 /// @return **True** if the weather data has been downloaded.
1174 /// \table_row3{ <b>`Weather.Conditions`</b>,
1175 /// \anchor Weather_Conditions
1177 /// @return The current weather conditions as textual description.
1178 /// @note This is looked up in a background process.
1181 /// \table_row3{ <b>`Weather.ConditionsIcon`</b>,
1182 /// \anchor Weather_ConditionsIcon
1184 /// @return The current weather conditions as an icon.
1185 /// @note This is looked up in a background process.
1188 /// \table_row3{ <b>`Weather.Temperature`</b>,
1189 /// \anchor Weather_Temperature
1191 /// @return The current weather temperature.
1194 /// \table_row3{ <b>`Weather.Location`</b>,
1195 /// \anchor Weather_Location
1197 /// @return The city/town which the above two items are for.
1200 /// \table_row3{ <b>`Weather.Fanartcode`</b>,
1201 /// \anchor Weather_fanartcode
1203 /// @return The current weather fanartcode.
1206 /// \table_row3{ <b>`Weather.Plugin`</b>,
1207 /// \anchor Weather_plugin
1209 /// @return The current weather plugin.
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
1227 /// \table_h3{ Labels, Type, Description }
1228 /// \table_row3{ <b>`System.AlarmLessOrEqual(alarmname\,seconds)`</b>,
1229 /// \anchor System_AlarmLessOrEqual
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:
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
1240 /// \table_row3{ <b>`System.HasNetwork`</b>,
1241 /// \anchor System_HasNetwork
1243 /// @return **True** if the Kodi host has a network available.
1244 /// @note This feature is NOT implemented. Always returns true
1247 /// \table_row3{ <b>`System.HasMediadvd`</b>,
1248 /// \anchor System_HasMediadvd
1250 /// @return **True** if there is a CD or DVD in the DVD-ROM drive.
1253 /// \table_row3{ <b>`System.HasMediaAudioCD`</b>,
1254 /// \anchor System_HasMediaAudioCD
1256 /// @return **True** if there is an audio CD in the optical drive. **False** if no drive
1257 /// available\, empty drive or other medium.
1259 /// @skinning_v18 **[New Boolean Condition]** \link System_HasMediaAudioCD
1260 /// `System.HasMediaAudioCD` \endlink <p>
1262 /// \table_row3{ <b>`System.DVDReady`</b>,
1263 /// \anchor System_DVDReady
1265 /// @return **True** if the disc is ready to use.
1268 /// \table_row3{ <b>`System.TrayOpen`</b>,
1269 /// \anchor System_TrayOpen
1271 /// @return **True** if the disc tray is open.
1274 /// \table_row3{ <b>`System.HasLocks`</b>,
1275 /// \anchor System_HasLocks
1277 /// @return **True** if the system has an active lock mode.
1280 /// \table_row3{ <b>`System.IsMaster`</b>,
1281 /// \anchor System_IsMaster
1283 /// @return **True** if the system is in master mode.
1286 /// \table_row3{ <b>`System.ShowExitButton`</b>,
1287 /// \anchor System_ShowExitButton
1289 /// @return **True** if the exit button should be shown (configurable via advanced settings).
1292 /// \table_row3{ <b>`System.DPMSActive`</b>,
1293 /// \anchor System_DPMSActive
1295 /// @return **True** if DPMS (VESA Display Power Management Signaling) mode is active.
1298 /// \table_row3{ <b>`System.IsStandalone`</b>,
1299 /// \anchor System_IsStandalone
1301 /// @return **True** if Kodi is running in standalone mode.
1304 /// \table_row3{ <b>`System.IsFullscreen`</b>,
1305 /// \anchor System_IsFullscreen
1307 /// @return **True** if Kodi is running fullscreen.
1310 /// \table_row3{ <b>`System.LoggedOn`</b>,
1311 /// \anchor System_LoggedOn
1313 /// @return **True** if a user is currently logged on under a profile.
1316 /// \table_row3{ <b>`System.HasLoginScreen`</b>,
1317 /// \anchor System_HasLoginScreen
1319 /// @return **True** if the profile login screen is enabled.
1322 /// \table_row3{ <b>`System.HasPVR`</b>,
1323 /// \anchor System_HasPVR
1325 /// @return **True** if PVR is supported from Kodi.
1326 /// @note normally always true
1329 /// \table_row3{ <b>`System.HasPVRAddon`</b>,
1330 /// \anchor System_HasPVRAddon
1332 /// @return **True** if at least one pvr client addon is installed and enabled.
1333 /// @param id - addon id of the PVR addon
1335 /// @skinning_v17 **[New Boolean Condition]** \link System_HasPVRAddon
1336 /// `System.HasPVRAddon`\endlink <p>
1338 /// \table_row3{ <b>`System.HasCMS`</b>,
1339 /// \anchor System_HasCMS
1341 /// @return **True** if colour management is supported from Kodi.
1342 /// @note currently only supported for OpenGL
1344 /// @skinning_v17 **[New Boolean Condition]** \link System_HasCMS `System.HasCMS`\endlink
1347 /// \table_row3{ <b>`System.HasActiveModalDialog`</b>,
1348 /// \anchor System_HasActiveModalDialog
1350 /// @return **True** if a modal dialog is active.
1352 /// @skinning_v18 **[New Boolean Condition]** \link System_HasActiveModalDialog
1353 /// `System.HasActiveModalDialog`\endlink <p>
1355 /// \table_row3{ <b>`System.HasVisibleModalDialog`</b>,
1356 /// \anchor System_HasVisibleModalDialog
1358 /// @return **True** if a modal dialog is visible.
1360 /// @skinning_v18 **[New Boolean Condition]** \link System_HasVisibleModalDialog
1361 /// `System.HasVisibleModalDialog`\endlink <p>
1363 /// \table_row3{ <b>`System.Platform.Linux`</b>,
1364 /// \anchor System_PlatformLinux
1366 /// @return **True** if Kodi is running on a linux/unix based computer.
1369 /// \table_row3{ <b>`System.Platform.Windows`</b>,
1370 /// \anchor System_PlatformWindows
1372 /// @return **True** if Kodi is running on a windows based computer.
1375 /// \table_row3{ <b>`System.Platform.UWP`</b>,
1376 /// \anchor System_PlatformUWP
1378 /// @return **True** if Kodi is running on Universal Windows Platform (UWP).
1380 /// @skinning_v18 **[New Boolean Condition]** \link System_PlatformUWP
1381 /// `System.Platform.UWP`\endlink <p>
1383 /// \table_row3{ <b>`System.Platform.OSX`</b>,
1384 /// \anchor System_PlatformOSX
1386 /// @return **True** if Kodi is running on an OSX based computer.
1389 /// \table_row3{ <b>`System.Platform.IOS`</b>,
1390 /// \anchor System_PlatformIOS
1392 /// @return **True** if Kodi is running on an IOS device.
1395 /// \table_row3{ <b>`System.Platform.TVOS`</b>,
1396 /// \anchor System_PlatformTVOS
1398 /// @return **True** if Kodi is running on a tvOS device.
1400 /// @skinning_v19 **[New Boolean Condition]** \link System_PlatformTVOS
1401 /// `System.Platform.TVOS`\endlink <p>
1403 /// \table_row3{ <b>`System.Platform.Darwin`</b>,
1404 /// \anchor System_PlatformDarwin
1406 /// @return **True** if Kodi is running on an OSX or IOS system.
1409 /// \table_row3{ <b>`System.Platform.Android`</b>,
1410 /// \anchor System_PlatformAndroid
1412 /// @return **True** if Kodi is running on an android device.
1415 /// \table_row3{ <b>`System.Platform.WebOS`</b>,
1416 /// \anchor System_PlatformWebOS
1418 /// @return **True** if Kodi is running on a WebOS device.
1420 /// @skinning_v21 **[New Boolean Condition]** \link System_PlatformWebOS
1421 /// `System.Platform.WebOS`\endlink <p>
1423 /// \table_row3{ <b>`System.CanPowerDown`</b>,
1424 /// \anchor System_CanPowerDown
1426 /// @return **True** if Kodi can powerdown the system.
1429 /// \table_row3{ <b>`System.CanSuspend`</b>,
1430 /// \anchor System_CanSuspend
1432 /// @return **True** if Kodi can suspend the system.
1435 /// \table_row3{ <b>`System.CanHibernate`</b>,
1436 /// \anchor System_CanHibernate
1438 /// @return **True** if Kodi can hibernate the system.
1441 /// \table_row3{ <b>`System.HasHiddenInput`</b>,
1442 /// \anchor System_HasHiddenInput
1444 /// @return **True** when to osd keyboard/numeric dialog requests a
1445 /// password/pincode.
1447 /// @skinning_v16 **[New Boolean Condition]** \link System_HasHiddenInput
1448 /// `System.HasHiddenInput`\endlink <p>
1450 /// \table_row3{ <b>`System.CanReboot`</b>,
1451 /// \anchor System_CanReboot
1453 /// @return **True** if Kodi can reboot the system.
1456 /// \table_row3{ <b>`System.ScreenSaverActive`</b>,
1457 /// \anchor System_ScreenSaverActive
1459 /// @return **True** if ScreenSaver is active.
1462 /// \table_row3{ <b>`System.IdleShutdownInhibited`</b>,
1463 /// \anchor System_IdleShutdownInhibited
1465 /// @return **True** when shutdown on idle is disabled.
1468 /// \table_row3{ <b>`System.HasShutdown`</b>,
1469 /// \anchor System_HasShutdown
1471 /// @return **True** if Kodi can shutdown the system.
1474 /// \table_row3{ <b>`System.Time`</b>,
1475 /// \anchor System_Time
1477 /// @return The current time.
1480 /// \table_row3{ <b>`System.Time(format)`</b>,
1481 /// \anchor System_Time_format
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.
1488 /// \table_row3{ <b>`System.Time(startTime[\,endTime])`</b>,
1489 /// \anchor System_Time
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
1495 /// @note Time must be specified in the format HH:mm\, using
1496 /// a 24 hour clock.
1499 /// \table_row3{ <b>`System.Date`</b>,
1500 /// \anchor System_Date
1502 /// @return The current date.
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
1509 /// \table_row3{ <b>`System.Date(format)`</b>,
1510 /// \anchor System_Date_format
1512 /// @return The current date using a specified format.
1513 /// @param format - the format for the date. It can be one of the following
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
1527 /// \table_row3{ <b>`System.Date(startDate[\,endDate])`</b>,
1528 /// \anchor System_Date
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.
1536 /// \table_row3{ <b>`System.AlarmPos`</b>,
1537 /// \anchor System_AlarmPos
1539 /// @return The shutdown Timer position.
1542 /// \table_row3{ <b>`System.BatteryLevel`</b>,
1543 /// \anchor System_BatteryLevel
1545 /// @return The remaining battery level in range 0-100.
1548 /// \table_row3{ <b>`System.FreeSpace`</b>,
1549 /// \anchor System_FreeSpace
1551 /// @return The total Freespace on the drive.
1554 /// \table_row3{ <b>`System.UsedSpace`</b>,
1555 /// \anchor System_UsedSpace
1557 /// @return The total Usedspace on the drive.
1560 /// \table_row3{ <b>`System.TotalSpace`</b>,
1561 /// \anchor System_TotalSpace
1563 /// @return The total space on the drive.
1566 /// \table_row3{ <b>`System.UsedSpacePercent`</b>,
1567 /// \anchor System_UsedSpacePercent
1569 /// @return The total Usedspace Percent on the drive.
1572 /// \table_row3{ <b>`System.FreeSpacePercent`</b>,
1573 /// \anchor System_FreeSpacePercent
1575 /// @return The total Freespace Percent on the drive.
1578 /// \table_row3{ <b>`System.CPUTemperature`</b>,
1579 /// \anchor System_CPUTemperature
1581 /// @return The current CPU temperature.
1584 /// \table_row3{ <b>`System.CpuUsage`</b>,
1585 /// \anchor System_CpuUsage
1587 /// @return The the cpu usage for each individual cpu core.
1590 /// \table_row3{ <b>`System.GPUTemperature`</b>,
1591 /// \anchor System_GPUTemperature
1593 /// @return The current GPU temperature.
1596 /// \table_row3{ <b>`System.FanSpeed`</b>,
1597 /// \anchor System_FanSpeed
1599 /// @return The current fan speed.
1602 /// \table_row3{ <b>`System.BuildVersion`</b>,
1603 /// \anchor System_BuildVersion
1605 /// @return The version of build.
1608 /// \table_row3{ <b>`System.BuildVersionShort`</b>,
1609 /// \anchor System_BuildVersionShort
1611 /// @return The shorter string with version of build.
1614 /// \table_row3{ <b>`System.BuildDate`</b>,
1615 /// \anchor System_BuildDate
1617 /// @return The date of build.
1620 /// \table_row3{ <b>`System.BuildVersionCode`</b>,
1621 /// \anchor System_BuildVersionCode
1623 /// @return The version code of build.
1626 /// \table_row3{ <b>`System.BuildVersionGit`</b>,
1627 /// \anchor System_BuildVersionGit
1629 /// @return The git version of build.
1632 /// \table_row3{ <b>`System.FriendlyName`</b>,
1633 /// \anchor System_FriendlyName
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)"
1640 /// \table_row3{ <b>`System.FPS`</b>,
1641 /// \anchor System_FPS
1643 /// @return The current rendering speed (frames per second).
1646 /// \table_row3{ <b>`System.FreeMemory`</b>,
1647 /// \anchor System_FreeMemory
1649 /// @return The amount of free memory in Mb.
1652 /// \table_row3{ <b>`System.ScreenMode`</b>,
1653 /// \anchor System_ScreenMode
1655 /// @return The screenmode (eg windowed / fullscreen).
1658 /// \table_row3{ <b>`System.ScreenWidth`</b>,
1659 /// \anchor System_ScreenWidth
1661 /// @return The width of screen in pixels.
1664 /// \table_row3{ <b>`System.ScreenHeight`</b>,
1665 /// \anchor System_ScreenHeight
1667 /// @return The height of screen in pixels.
1670 /// \table_row3{ <b>`System.StartupWindow`</b>,
1671 /// \anchor System_StartupWindow
1673 /// @return The Window Kodi will load on startup.
1675 /// @skinning_v13 **[New Infolabel]** \link System_StartupWindow `System.StartupWindow`\endlink
1678 /// \table_row3{ <b>`System.CurrentWindow`</b>,
1679 /// \anchor System_CurrentWindow
1681 /// @return The current Window in use.
1684 /// \table_row3{ <b>`System.CurrentControl`</b>,
1685 /// \anchor System_CurrentControl
1687 /// @return The current focused control
1690 /// \table_row3{ <b>`System.CurrentControlId`</b>,
1691 /// \anchor System_CurrentControlId
1693 /// @return The ID of the currently focused control.
1696 /// \table_row3{ <b>`System.DVDLabel`</b>,
1697 /// \anchor System_DVDLabel
1699 /// @return the label of the disk in the DVD-ROM drive.
1702 /// \table_row3{ <b>`System.KernelVersion`</b>,
1703 /// \anchor System_KernelVersion
1705 /// @return The System kernel version.
1708 /// \table_row3{ <b>`System.OSVersionInfo`</b>,
1709 /// \anchor System_OSVersionInfo
1711 /// @return The system name + kernel version.
1714 /// \table_row3{ <b>`System.Uptime`</b>,
1715 /// \anchor System_Uptime
1717 /// @return The system current uptime.
1720 /// \table_row3{ <b>`System.TotalUptime`</b>,
1721 /// \anchor System_TotalUptime
1723 /// @return The system total uptime.
1726 /// \table_row3{ <b>`System.CpuFrequency`</b>,
1727 /// \anchor System_CpuFrequency
1729 /// @return The system cpu frequency.
1732 /// \table_row3{ <b>`System.ScreenResolution`</b>,
1733 /// \anchor System_ScreenResolution
1735 /// @return The screen resolution.
1738 /// \table_row3{ <b>`System.VideoEncoderInfo`</b>,
1739 /// \anchor System_VideoEncoderInfo
1741 /// @return The video encoder info.
1744 /// \table_row3{ <b>`System.InternetState`</b>,
1745 /// \anchor System_InternetState
1747 /// @return The internet state: connected or not connected.
1748 /// @warning Do not use to check status in a pythonscript since it is threaded.
1751 /// \table_row3{ <b>`System.Language`</b>,
1752 /// \anchor System_Language
1754 /// @return the current language.
1757 /// \table_row3{ <b>`System.Locale(type)`</b>,
1758 /// \anchor System_Locale
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>.
1765 /// @skinning_v21 **[New Infolabel]** \link System_Locale
1766 /// `System.Locale(type)`\endlink
1768 /// @skinning_v22 **[Removed options]** `timezonecountry` and `timezone` from \link System_Locale
1769 /// `System.Locale(type)`\endlink
1772 /// \table_row3{ <b>`System.ProfileName`</b>,
1773 /// \anchor System_ProfileName
1775 /// @return The user name of the currently logged in Kodi user
1778 /// \table_row3{ <b>`System.ProfileThumb`</b>,
1779 /// \anchor System_ProfileThumb
1781 /// @return The thumbnail image of the currently logged in Kodi user
1784 /// \table_row3{ <b>`System.ProfileCount`</b>,
1785 /// \anchor System_ProfileCount
1787 /// @return The number of defined profiles.
1790 /// \table_row3{ <b>`System.ProfileAutoLogin`</b>,
1791 /// \anchor System_ProfileAutoLogin
1793 /// @return The profile Kodi will auto login to.
1795 /// @skinning_v13 **[New Infolabel]** \link System_ProfileAutoLogin
1796 /// `System.ProfileAutoLogin`\endlink <p>
1798 /// \table_row3{ <b>`System.StereoscopicMode`</b>,
1799 /// \anchor System_StereoscopicMode
1801 /// @return The preferred stereoscopic mode.
1802 /// @note Configured in settings > video > playback).
1804 /// @skinning_v13 **[New Infolabel]** \link System_StereoscopicMode
1805 /// `System.StereoscopicMode`\endlink <p>
1807 /// \table_row3{ <b>`System.TemperatureUnits`</b>,
1808 /// \anchor System_TemperatureUnits
1810 /// @return the Celsius or the Fahrenheit symbol.
1813 /// \table_row3{ <b>`System.Progressbar`</b>,
1814 /// \anchor System_Progressbar
1816 /// @return The percentage of the currently active progress.
1819 /// \table_row3{ <b>`System.GetBool(boolean)`</b>,
1820 /// \anchor System_GetBool
1822 /// @return The value of any standard system boolean setting.
1823 /// @note Will not work with settings in advancedsettings.xml
1826 /// \table_row3{ <b>`System.Memory(type)`</b>,
1827 /// \anchor System_Memory
1829 /// @return The memory value depending on the requested type.
1830 /// @param type - Can be one of the following:
1832 /// - <b>free.percent</b>
1834 /// - <b>used.percent</b>
1838 /// \table_row3{ <b>`System.AddonTitle(id)`</b>,
1839 /// \anchor System_AddonTitle
1841 /// @return The title of the addon with the given id
1842 /// @param id - the addon id
1845 /// \table_row3{ <b>`System.AddonVersion(id)`</b>,
1846 /// \anchor System_AddonVersion
1848 /// @return The version of the addon with the given id.
1849 /// @param id - the addon id
1851 /// @skinning_v13 **[New Infolabel]** \link System_AddonVersion
1852 /// `System.AddonVersion(id)`\endlink <p>
1854 /// \table_row3{ <b>`System.AddonIcon(id)`</b>,
1855 /// \anchor System_AddonVersion
1857 /// @return The icon of the addon with the given id.
1858 /// @param id - the addon id
1861 /// \table_row3{ <b>`System.AddonUpdateCount`</b>,
1862 /// \anchor System_AddonUpdateCount
1864 /// @return The number of available addon updates.
1866 /// @skinning_v19 **[New Infolabel]** \link System_AddonUpdateCount `
1867 /// System.AddonUpdateCount`\endlink <p>
1869 /// \table_row3{ <b>`System.IdleTime(time)`</b>,
1870 /// \anchor System_IdleTime
1872 /// @return **True** if Kodi has had no input for `time` amount of seconds.
1873 /// @param time - elapsed seconds to check for idle activity.
1876 /// \table_row3{ <b>`System.PrivacyPolicy`</b>,
1877 /// \anchor System_PrivacyPolicy
1879 /// @return The official Kodi privacy policy.
1881 /// @skinning_v17 **[New Infolabel]** \link System_PrivacyPolicy `System.PrivacyPolicy`\endlink
1884 /// \table_row3{ <b>`System.SupportsCPUUsage`</b>,
1885 /// \anchor System_SupportsCPUUsage
1887 /// @return **True** if the system can provide CPU usage information.
1889 /// @skinning_v19 **[New Boolean Condition]** \link System_SupportsCPUUsage `
1890 /// System.SupportsCPUUsage`\endlink <p>
1892 /// \table_row3{ <b>`System.SupportedHDRTypes`</b>,
1893 /// \anchor System_SupportedHDRTypes
1895 /// @return The display's supported HDR types.
1897 /// @skinning_v20 **[New Infolabel]** \link System_SupportedHDRTypes `System.SupportedHDRTypes`\endlink
1900 /// \table_row3{ <b>`System.IsScreensaverInhibited`</b>,
1901 /// \anchor System_IsScreensaverInhibited
1903 /// @return **True** when screensaver on idle is disabled.
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
},
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
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
1993 /// \table_row3{ <b>`System.AddonIsEnabled(id)`</b>,
1994 /// \anchor System_AddonIsEnabled
1996 /// @return **True** if the specified addon is enabled on the system.
1997 /// @param id - The addon Id
1999 /// @skinning_v19 **[New Boolean Condition]** \link System_AddonIsEnabled `System.AddonIsEnabled(id)`\endlink
2002 /// \table_row3{ <b>`System.HasCoreId(id)`</b>,
2003 /// \anchor System_HasCoreId
2005 /// @return **True** if the CPU core with the given 'id' exists.
2006 /// @param id - the id of the CPU core
2009 /// \table_row3{ <b>`System.HasAlarm(alarm)`</b>,
2010 /// \anchor System_HasAlarm
2012 /// @return **True** if the system has the `alarm` alarm set.
2013 /// @param alarm - the name of the alarm
2016 /// \table_row3{ <b>`System.CoreUsage(id)`</b>,
2017 /// \anchor System_CoreUsage
2019 /// @return the usage of the CPU core with the given 'id'
2020 /// @param id - the id of the CPU core
2023 /// \table_row3{ <b>`System.Setting(hidewatched)`</b>,
2024 /// \anchor System_Setting
2026 /// @return **True** if 'hide watched items' is selected.
2029 /// \table_row3{ <b>`System.Setting(hideunwatchedepisodethumbs)`</b>,
2030 /// \anchor System_Setting_HideUnwatchedEpisodeThumbs
2032 /// @return **True** if 'hide unwatched episode setting is enabled'\, **False** otherwise.
2034 /// @skinning_v20 **[New Boolean Condition]** \link System_Setting_HideUnwatchedEpisodeThumbs `System.Setting(hideunwatchedepisodethumbs)`\endlink
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
2050 /// \table_h3{ Labels, Type, Description }
2051 /// \table_row3{ <b>`Network.IsDHCP`</b>,
2052 /// \anchor Network_IsDHCP
2054 /// @return **True** if the network type is DHCP.
2055 /// @note Network type can be either DHCP or FIXED
2058 /// \table_row3{ <b>`Network.IPAddress`</b>,
2059 /// \anchor Network_IPAddress
2061 /// @return The system's IP Address. e.g. 192.168.1.15
2064 /// \table_row3{ <b>`Network.LinkState`</b>,
2065 /// \anchor Network_LinkState
2067 /// @return The network linkstate e.g. 10mbit/100mbit etc.
2070 /// \table_row3{ <b>`Network.MacAddress`</b>,
2071 /// \anchor Network_MacAddress
2073 /// @return The system's MAC address.
2076 /// \table_row3{ <b>`Network.SubnetMask`</b>,
2077 /// \anchor Network_SubnetMask
2079 /// @return The network subnet mask.
2082 /// \table_row3{ <b>`Network.GatewayAddress`</b>,
2083 /// \anchor Network_GatewayAddress
2085 /// @return The network gateway address.
2088 /// \table_row3{ <b>`Network.DNS1Address`</b>,
2089 /// \anchor Network_DNS1Address
2091 /// @return The network DNS 1 address.
2094 /// \table_row3{ <b>`Network.DNS2Address`</b>,
2095 /// \anchor Network_DNS2Address
2097 /// @return The network DNS 2 address.
2102 /// -----------------------------------------------------------------------------
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
}
2116 /// \page modules__infolabels_boolean_conditions
2117 /// \subsection modules__infolabels_boolean_conditions_musicpartymode Music party mode
2119 /// \table_h3{ Labels, Type, Description }
2120 /// \table_row3{ <b>`MusicPartyMode.Enabled`</b>,
2121 /// \anchor MusicPartyMode_Enabled
2123 /// @return **True** if Party Mode is enabled.
2126 /// \table_row3{ <b>`MusicPartyMode.SongsPlayed`</b>,
2127 /// \anchor MusicPartyMode_SongsPlayed
2129 /// @return The number of songs played during Party Mode.
2132 /// \table_row3{ <b>`MusicPartyMode.MatchingSongs`</b>,
2133 /// \anchor MusicPartyMode_MatchingSongs
2135 /// @return The number of songs available to Party Mode.
2138 /// \table_row3{ <b>`MusicPartyMode.MatchingSongsPicked`</b>,
2139 /// \anchor MusicPartyMode_MatchingSongsPicked
2141 /// @return The number of songs picked already for Party Mode.
2144 /// \table_row3{ <b>`MusicPartyMode.MatchingSongsLeft`</b>,
2145 /// \anchor MusicPartyMode_MatchingSongsLeft
2147 /// @return The number of songs left to be picked from for Party Mode.
2150 /// \table_row3{ <b>`MusicPartyMode.RelaxedSongsPicked`</b>,
2151 /// \anchor MusicPartyMode_RelaxedSongsPicked
2153 /// @todo Not currently used
2156 /// \table_row3{ <b>`MusicPartyMode.RandomSongsPicked`</b>,
2157 /// \anchor MusicPartyMode_RandomSongsPicked
2159 /// @return The number of unique random songs picked during Party Mode.
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
2176 /// \table_h3{ Labels, Type, Description }
2177 /// \table_row3{ <b>`MusicPlayer.Offset(number).Exists`</b>,
2178 /// \anchor MusicPlayer_Offset
2180 /// @return **True** if the music players playlist has a song queued in
2181 /// position (number).
2182 /// @param number - song position
2185 /// \table_row3{ <b>`MusicPlayer.Title`</b>,
2186 /// \anchor MusicPlayer_Title
2188 /// @return The title of the currently playing song.
2191 /// \table_row3{ <b>`MusicPlayer.offset(number).Title`</b>,
2192 /// \anchor MusicPlayer_Offset_Title
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
2199 /// \table_row3{ <b>`MusicPlayer.Position(number).Title`</b>,
2200 /// \anchor MusicPlayer_Position_Title
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
2207 /// \table_row3{ <b>`MusicPlayer.Album`</b>,
2208 /// \anchor MusicPlayer_Album
2210 /// @return The album from which the current song is from.
2213 /// \table_row3{ <b>`MusicPlayer.offset(number).Album`</b>,
2214 /// \anchor MusicPlayer_OffSet_Album
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
2221 /// \table_row3{ <b>`MusicPlayer.Position(number).Album`</b>,
2222 /// \anchor MusicPlayer_Position_Album
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
2229 /// \table_row3{ <b>`MusicPlayer.Property(Album_Mood)`</b>,
2230 /// \anchor MusicPlayer_Property_Album_Mood
2232 /// @return The moods of the currently playing Album
2235 /// \table_row3{ <b>`MusicPlayer.Property(Role.Composer)`</b>,
2236 /// \anchor MusicPlayer_Property_Role_Composer
2238 /// @return The name of the person who composed the selected song.
2240 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Composer `MusicPlayer.Property(Role.Composer)`\endlink
2243 /// \table_row3{ <b>`MusicPlayer.Property(Role.Conductor)`</b>,
2244 /// \anchor MusicPlayer_Property_Role_Conductor
2246 /// @return The name of the person who conducted the selected song.
2248 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Conductor `MusicPlayer.Property(Role.Conductor)`\endlink
2251 /// \table_row3{ <b>`MusicPlayer.Property(Role.Orchestra)`</b>,
2252 /// \anchor MusicPlayer_Property_Role_Orchestra
2254 /// @return The name of the orchestra performing the selected song.
2256 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Orchestra `MusicPlayer.Property(Role.Orchestra)`\endlink
2259 /// \table_row3{ <b>`MusicPlayer.Property(Role.Lyricist)`</b>,
2260 /// \anchor MusicPlayer_Property_Role_Lyricist
2262 /// @return The name of the person who wrote the lyrics of the selected song.
2264 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Lyricist `MusicPlayer.Property(Role.Lyricist)`\endlink
2267 /// \table_row3{ <b>`MusicPlayer.Property(Role.Remixer)`</b>,
2268 /// \anchor MusicPlayer_Property_Role_Remixer
2270 /// @return The name of the person who remixed the selected song.
2272 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Remixer `MusicPlayer.Property(Role.Remixer)`\endlink
2275 /// \table_row3{ <b>`MusicPlayer.Property(Role.Arranger)`</b>,
2276 /// \anchor MusicPlayer_Property_Role_Arranger
2278 /// @return The name of the person who arranged the selected song.
2280 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Arranger `MusicPlayer.Property(Role.Arranger)`\endlink
2283 /// \table_row3{ <b>`MusicPlayer.Property(Role.Engineer)`</b>,
2284 /// \anchor MusicPlayer_Property_Role_Engineer
2286 /// @return The name of the person who was the engineer of the selected song.
2288 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Engineer `MusicPlayer.Property(Role.Engineer)`\endlink
2291 /// \table_row3{ <b>`MusicPlayer.Property(Role.Producer)`</b>,
2292 /// \anchor MusicPlayer_Property_Role_Producer
2294 /// @return The name of the person who produced the selected song.
2296 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Producer `MusicPlayer.Property(Role.Producer)`\endlink
2299 /// \table_row3{ <b>`MusicPlayer.Property(Role.DJMixer)`</b>,
2300 /// \anchor MusicPlayer_Property_Role_DJMixer
2302 /// @return The name of the dj who remixed the selected song.
2304 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_DJMixer `MusicPlayer.Property(Role.DJMixer)`\endlink
2307 /// \table_row3{ <b>`MusicPlayer.Property(Role.Mixer)`</b>,
2308 /// \anchor MusicPlayer_Property_Role_Mixer
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.
2318 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Mixer `MusicPlayer.Property(Role.Mixer)`\endlink
2321 /// \table_row3{ <b>`MusicPlayer.Property(Album_Mood)`</b>,
2322 /// \anchor MusicPlayer_Property_Album_Mood
2324 /// @return the moods of the currently playing Album
2327 /// \table_row3{ <b>`MusicPlayer.Property(Album_Style)`</b>,
2328 /// \anchor MusicPlayer_Property_Album_Style
2330 /// @return the styles of the currently playing Album.
2333 /// \table_row3{ <b>`MusicPlayer.Property(Album_Theme)`</b>,
2334 /// \anchor MusicPlayer_Property_Album_Theme
2336 /// @return The themes of the currently playing Album
2339 /// \table_row3{ <b>`MusicPlayer.Property(Album_Type)`</b>,
2340 /// \anchor MusicPlayer_Property_Album_Type
2342 /// @return The album type (e.g. compilation\, enhanced\, explicit lyrics) of the
2343 /// currently playing album.
2346 /// \table_row3{ <b>`MusicPlayer.Property(Album_Label)`</b>,
2347 /// \anchor MusicPlayer_Property_Album_Label
2349 /// @return The record label of the currently playing album.
2352 /// \table_row3{ <b>`MusicPlayer.Property(Album_Description)`</b>,
2353 /// \anchor MusicPlayer_Property_Album_Description
2355 /// @return A review of the currently playing album
2358 /// \table_row3{ <b>`MusicPlayer.Artist`</b>,
2359 /// \anchor MusicPlayer_Artist
2361 /// @return Artist(s) of current song.
2364 /// \table_row3{ <b>`MusicPlayer.offset(number).Artist`</b>,
2365 /// \anchor MusicPlayer_Offset_Artist
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
2373 /// \table_row3{ <b>`MusicPlayer.Position(number).Artist`</b>,
2374 /// \anchor MusicPlayer_Position_Artist
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
2382 /// \table_row3{ <b>`MusicPlayer.AlbumArtist`</b>,
2383 /// \anchor MusicPlayer_AlbumArtist
2385 /// @return The album artist of the currently playing song.
2388 /// \table_row3{ <b>`MusicPlayer.Cover`</b>,
2389 /// \anchor MusicPlayer_Cover
2391 /// @return The album cover of currently playing song.
2394 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Sortname)`</b>,
2395 /// \anchor MusicPlayer_Property_Artist_Sortname
2397 /// @return The sortname of the currently playing Artist.
2399 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Sortname `MusicPlayer.Property(Artist_Sortname)`\endlink
2402 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Type)`</b>,
2403 /// \anchor MusicPlayer_Property_Artist_Type
2405 /// @return The type of the currently playing Artist - person\,
2406 /// group\, orchestra\, choir etc.
2408 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Type `MusicPlayer.Property(Artist_Type)`\endlink
2411 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Gender)`</b>,
2412 /// \anchor MusicPlayer_Property_Artist_Gender
2414 /// @return The gender of the currently playing Artist - male\,
2417 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Gender `MusicPlayer.Property(Artist_Gender)`\endlink
2420 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Disambiguation)`</b>,
2421 /// \anchor MusicPlayer_Property_Artist_Disambiguation
2423 /// @return A brief description of the currently playing Artist that differentiates them
2424 /// from others with the same name.
2426 /// @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Disambiguation `MusicPlayer.Property(Artist_Disambiguation)`\endlink
2429 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Born)`</b>,
2430 /// \anchor MusicPlayer_Property_Artist_Born
2432 /// @return The date of Birth of the currently playing Artist.
2435 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Died)`</b>,
2436 /// \anchor MusicPlayer_Property_Artist_Died
2438 /// @return The date of Death of the currently playing Artist.
2441 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Formed)`</b>,
2442 /// \anchor MusicPlayer_Property_Artist_Formed
2444 /// @return The Formation date of the currently playing Artist/Band.
2447 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Disbanded)`</b>,
2448 /// \anchor MusicPlayer_Property_Artist_Disbanded
2450 /// @return The disbanding date of the currently playing Artist/Band.
2453 /// \table_row3{ <b>`MusicPlayer.Property(Artist_YearsActive)`</b>,
2454 /// \anchor MusicPlayer_Property_Artist_YearsActive
2456 /// @return The years the currently Playing artist has been active.
2459 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Instrument)`</b>,
2460 /// \anchor MusicPlayer_Property_Artist_Instrument
2462 /// @return The instruments played by the currently playing artist.
2465 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Description)`</b>,
2466 /// \anchor MusicPlayer_Property_Artist_Description
2468 /// @return A biography of the currently playing artist.
2471 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Mood)`</b>,
2472 /// \anchor MusicPlayer_Property_Artist_Mood
2474 /// @return The moods of the currently playing artist.
2477 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Style)`</b>,
2478 /// \anchor MusicPlayer_Property_Artist_Style
2480 /// @return The styles of the currently playing artist.
2483 /// \table_row3{ <b>`MusicPlayer.Property(Artist_Genre)`</b>,
2484 /// \anchor MusicPlayer_Property_Artist_Genre
2486 /// @return The genre of the currently playing artist.
2489 /// \table_row3{ <b>`MusicPlayer.Genre`</b>,
2490 /// \anchor MusicPlayer_Genre
2492 /// @return The genre(s) of current song.
2495 /// \table_row3{ <b>`MusicPlayer.offset(number).Genre`</b>,
2496 /// \anchor MusicPlayer_OffSet_Genre
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
2504 /// \table_row3{ <b>`MusicPlayer.Position(number).Genre`</b>,
2505 /// \anchor MusicPlayer_Position_Genre
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
2514 /// \table_row3{ <b>`MusicPlayer.Lyrics`</b>,
2515 /// \anchor MusicPlayer_Lyrics
2517 /// @return The lyrics of current song stored in ID tag info.
2520 /// \table_row3{ <b>`MusicPlayer.Year`</b>,
2521 /// \anchor MusicPlayer_Year
2523 /// @return The year of release of current song.
2526 /// \table_row3{ <b>`MusicPlayer.offset(number).Year`</b>,
2527 /// \anchor MusicPlayer_Offset_Year
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.
2534 /// \table_row3{ <b>`MusicPlayer.Position(number).Year`</b>,
2535 /// \anchor MusicPlayer_Position_Year
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
2543 /// \table_row3{ <b>`MusicPlayer.Rating`</b>,
2544 /// \anchor MusicPlayer_Rating
2546 /// @return The numeric Rating of current song (1-10).
2549 /// \table_row3{ <b>`MusicPlayer.offset(number).Rating`</b>,
2550 /// \anchor MusicPlayer_OffSet_Rating
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
2557 /// \table_row3{ <b>`MusicPlayer.Position(number).Rating`</b>,
2558 /// \anchor MusicPlayer_Position_Rating
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
2565 /// \table_row3{ <b>`MusicPlayer.RatingAndVotes`</b>,
2566 /// \anchor MusicPlayer_RatingAndVotes
2568 /// @return The scraped rating and votes of currently playing song\, if it's in the database.
2571 /// \table_row3{ <b>`MusicPlayer.UserRating`</b>,
2572 /// \anchor MusicPlayer_UserRating
2574 /// @return The scraped rating of the currently playing song (1-10).
2576 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_UserRating `MusicPlayer.UserRating`\endlink
2579 /// \table_row3{ <b>`MusicPlayer.Votes`</b>,
2580 /// \anchor MusicPlayer_Votes
2582 /// @return The scraped votes of currently playing song\, if it's in the database.
2585 /// \table_row3{ <b>`MusicPlayer.DiscNumber`</b>,
2586 /// \anchor MusicPlayer_DiscNumber
2588 /// @return The Disc Number of current song stored in ID tag info.
2591 /// \table_row3{ <b>`MusicPlayer.offset(number).DiscNumber`</b>,
2592 /// \anchor MusicPlayer_Offset_DiscNumber
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
2600 /// \table_row3{ <b>`MusicPlayer.Position(number).DiscNumber`</b>,
2601 /// \anchor MusicPlayer_Position_DiscNumber
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.
2609 /// \table_row3{ <b>`MusicPlayer.Comment`</b>,
2610 /// \anchor MusicPlayer_Comment
2612 /// @return The Comment of current song stored in ID tag info.
2615 /// \table_row3{ <b>`MusicPlayer.offset(number).Comment`</b>,
2616 /// \anchor MusicPlayer_Offset_Comment
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
2624 /// \table_row3{ <b>`MusicPlayer.Position(number).Comment`</b>,
2625 /// \anchor MusicPlayer_Position_Comment
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.
2633 /// \table_row3{ <b>`MusicPlayer.Contributors`</b>,
2634 /// \anchor MusicPlayer_Contributors
2636 /// @return The list of all people who've contributed to the currently playing song
2638 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Contributors `MusicPlayer.Contributors`\endlink
2641 /// \table_row3{ <b>`MusicPlayer.ContributorAndRole`</b>,
2642 /// \anchor MusicPlayer_ContributorAndRole
2644 /// @return The list of all people and their role who've contributed to the currently playing song.
2646 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_ContributorAndRole `MusicPlayer.ContributorAndRole`\endlink
2649 /// \table_row3{ <b>`MusicPlayer.Mood`</b>,
2650 /// \anchor MusicPlayer_Mood
2652 /// @return The mood of the currently playing song.
2654 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_Mood `MusicPlayer.Mood`\endlink
2657 /// \table_row3{ <b>`MusicPlayer.PlaylistPlaying`</b>,
2658 /// \anchor MusicPlayer_PlaylistPlaying
2660 /// @return **True** if a playlist is currently playing.
2663 /// \table_row3{ <b>`MusicPlayer.Exists(relative\,position)`</b>,
2664 /// \anchor MusicPlayer_Exists
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.
2672 /// \table_row3{ <b>`MusicPlayer.HasPrevious`</b>,
2673 /// \anchor MusicPlayer_HasPrevious
2675 /// @return **True** if the music player has a a Previous Song in the Playlist.
2678 /// \table_row3{ <b>`MusicPlayer.HasNext`</b>,
2679 /// \anchor MusicPlayer_HasNext
2681 /// @return **True** if the music player has a next song queued in the Playlist.
2684 /// \table_row3{ <b>`MusicPlayer.PlayCount`</b>,
2685 /// \anchor MusicPlayer_PlayCount
2687 /// @return The play count of currently playing song\, if it's in the database.
2690 /// \table_row3{ <b>`MusicPlayer.LastPlayed`</b>,
2691 /// \anchor MusicPlayer_LastPlayed
2693 /// @return The last play date of currently playing song\, if it's in the database.
2696 /// \table_row3{ <b>`MusicPlayer.TrackNumber`</b>,
2697 /// \anchor MusicPlayer_TrackNumber
2699 /// @return The track number of current song.
2702 /// \table_row3{ <b>`MusicPlayer.offset(number).TrackNumber`</b>,
2703 /// \anchor MusicPlayer_Offset_TrackNumber
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
2711 /// \table_row3{ <b>`MusicPlayer.Position(number).TrackNumber`</b>,
2712 /// \anchor MusicPlayer_Position_TrackNumber
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
2720 /// \table_row3{ <b>`MusicPlayer.Duration`</b>,
2721 /// \anchor MusicPlayer_Duration
2723 /// @return The duration of the current song.
2726 /// \table_row3{ <b>`MusicPlayer.offset(number).Duration`</b>,
2727 /// \anchor MusicPlayer_Offset_Duration
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
2735 /// \table_row3{ <b>`MusicPlayer.Position(number).Duration`</b>,
2736 /// \anchor MusicPlayer_Position_Duration
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
2744 /// \table_row3{ <b>`MusicPlayer.BitRate`</b>,
2745 /// \anchor MusicPlayer_BitRate
2747 /// @return The bitrate of current song.
2750 /// \table_row3{ <b>`MusicPlayer.Channels`</b>,
2751 /// \anchor MusicPlayer_Channels
2753 /// @return The number of channels of current song.
2756 /// \table_row3{ <b>`MusicPlayer.BitsPerSample`</b>,
2757 /// \anchor MusicPlayer_BitsPerSample
2759 /// @return The number of bits per sample of current song.
2762 /// \table_row3{ <b>`MusicPlayer.SampleRate`</b>,
2763 /// \anchor MusicPlayer_SampleRate
2765 /// @return The samplerate of current playing song.
2768 /// \table_row3{ <b>`MusicPlayer.Codec`</b>,
2769 /// \anchor MusicPlayer_Codec
2771 /// @return The codec of current playing song.
2774 /// \table_row3{ <b>`MusicPlayer.PlaylistPosition`</b>,
2775 /// \anchor MusicPlayer_PlaylistPosition
2777 /// @return The position of the current song in the current music playlist.
2780 /// \table_row3{ <b>`MusicPlayer.PlaylistLength`</b>,
2781 /// \anchor MusicPlayer_PlaylistLength
2783 /// @return The total size of the current music playlist.
2786 /// \table_row3{ <b>`MusicPlayer.ChannelName`</b>,
2787 /// \anchor MusicPlayer_ChannelName
2789 /// @return The channel name of the radio programme that's currently playing (PVR).
2792 /// \table_row3{ <b>`MusicPlayer.ChannelLogo`</b>,
2793 /// \anchor MusicPlayer_ChannelLogo
2795 /// @return The path for the logo of the currently playing radio channel\, if available (PVR).
2797 /// @skinning_v22 **[New Infolabel]** \link MusicPlayer_ChannelLogo `MusicPlayer.ChannelLogo`\endlink
2800 /// \table_row3{ <b>`MusicPlayer.ChannelNumberLabel`</b>,
2801 /// \anchor MusicPlayer_ChannelNumberLabel
2803 /// @return The channel and subchannel number of the radio channel that's currently
2806 /// @skinning_v14 **[New Infolabel]** \link MusicPlayer_ChannelNumberLabel `MusicPlayer.ChannelNumberLabel`\endlink
2809 /// \table_row3{ <b>`MusicPlayer.ChannelGroup`</b>,
2810 /// \anchor MusicPlayer_ChannelGroup
2812 /// @return The channel group of the radio programme that's currently playing (PVR).
2815 /// \table_row3{ <b>`MusicPlayer.Property(propname)`</b>,
2816 /// \anchor MusicPlayer_Property_Propname
2818 /// @return The requested property value of the currently playing item.
2819 /// @param propname - The requested property
2822 /// \table_row3{ <b>`MusicPlayer.DBID`</b>,
2823 /// \anchor MusicPlayer_DBID
2825 /// @return The database id of the currently playing song.
2827 /// @skinning_v17 **[New Infolabel]** \link MusicPlayer_DBID `MusicPlayer.DBID`\endlink
2830 /// \table_row3{ <b>`MusicPlayer.DiscTitle`</b>,
2831 /// \anchor MusicPlayer_DiscTitle
2833 /// @return The title of the disc currently playing.
2835 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_DiscTitle `MusicPlayer.DiscTitle`\endlink
2838 /// \table_row3{ <b>`MusicPlayer.ReleaseDate`</b>,
2839 /// \anchor MusicPlayer_ReleaseDate
2841 /// @return The release date of the song currently playing.
2843 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_ReleaseDate `MusicPlayer.ReleaseDate`\endlink
2846 /// \table_row3{ <b>`MusicPlayer.OriginalDate`</b>,
2847 /// \anchor MusicPlayer_OriginalDate
2849 /// @return The original release date of the song currently playing.
2851 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_OriginalDate `MusicPlayer.OriginalDate`\endlink
2854 /// \table_row3{ <b>`MusicPlayer.BPM`</b>,
2855 /// \anchor MusicPlayer_BPM
2857 /// @return The bpm of the track currently playing.
2859 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_BPM `MusicPlayer.BPM`\endlink
2862 /// \table_row3{ <b>`MusicPlayer.IsMultiDisc`</b>,
2863 /// \anchor MusicPlayer_IsMultiDisc
2865 /// @return Returns **true** if the album currently playing has more than one disc.
2867 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_IsMultiDisc `MusicPlayer.IsMultiDisc`\endlink
2870 /// \table_row3{ <b>`MusicPlayer.TotalDiscs`</b>,
2871 /// \anchor MusicPlayer_TotalDiscs
2873 /// @return The number of discs associated with the currently playing album.
2875 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_TotalDiscs `MusicPlayer.TotalDiscs`\endlink
2878 /// \table_row3{ <b>`MusicPlayer.Station`</b>,
2879 /// \anchor MusicPlayer_Station
2881 /// @return The name of the radio station currently playing (if available).
2883 /// @skinning_v19 **[New Infolabel]** \link MusicPlayer_Station `MusicPlayer.Station`\endlink
2888 /// -----------------------------------------------------------------------------
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
}
2938 /// \page modules__infolabels_boolean_conditions
2939 /// \subsection modules__infolabels_boolean_conditions_Videoplayer Video player
2941 /// \table_h3{ Labels, Type, Description }
2942 /// \table_row3{ <b>`VideoPlayer.UsingOverlays`</b>,
2943 /// \anchor VideoPlayer_UsingOverlays
2945 /// @return **True** if the video player is using the hardware overlays render
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.
2951 /// \table_row3{ <b>`VideoPlayer.IsFullscreen`</b>,
2952 /// \anchor VideoPlayer_IsFullscreen
2954 /// @return **True** if the video player is in fullscreen mode.
2957 /// \table_row3{ <b>`VideoPlayer.HasMenu`</b>,
2958 /// \anchor VideoPlayer_HasMenu
2960 /// @return **True** if the video player has a menu (ie is playing a DVD).
2963 /// \table_row3{ <b>`VideoPlayer.HasInfo`</b>,
2964 /// \anchor VideoPlayer_HasInfo
2966 /// @return **True** if the current playing video has information from the
2967 /// library or from a plugin (eg director/plot etc.)
2970 /// \table_row3{ <b>`VideoPlayer.HasVideoVersions`</b>,
2971 /// \anchor VideoPlayer_HasVideoVersions
2973 /// @return **True** when the played item has multiple video versions.
2975 /// @skinning_v21 **[New Infolabel]** \link VideoPlayer_HasVideoVersions `VideoPlayer.HasVideoVersions`\endlink
2977 /// \table_row3{ <b>`VideoPlayer.Content(parameter)`</b>,
2978 /// \anchor VideoPlayer_Content
2980 /// @return **True** if the current Video you are playing is contained in
2981 /// corresponding Video Library sections. The following values are accepted:
2984 /// - <b>episodes</b>
2985 /// - <b>musicvideos</b>
2989 /// \table_row3{ <b>`VideoPlayer.HasSubtitles`</b>,
2990 /// \anchor VideoPlayer_HasSubtitles
2992 /// @return **True** if there are subtitles available for video.
2995 /// \table_row3{ <b>`VideoPlayer.HasTeletext`</b>,
2996 /// \anchor VideoPlayer_HasTeletext
2998 /// @return **True** if teletext is usable on played TV channel.
3001 /// \table_row3{ <b>`VideoPlayer.IsStereoscopic`</b>,
3002 /// \anchor VideoPlayer_IsStereoscopic
3004 /// @return **True** when the currently playing video is a 3D (stereoscopic)
3007 /// @skinning_v13 **[New Boolean Condition]** \link VideoPlayer_IsStereoscopic `VideoPlayer.IsStereoscopic`\endlink
3010 /// \table_row3{ <b>`VideoPlayer.SubtitlesEnabled`</b>,
3011 /// \anchor VideoPlayer_SubtitlesEnabled
3013 /// @return **True** if subtitles are turned on for video.
3016 /// \table_row3{ <b>`VideoPlayer.HasEpg`</b>,
3017 /// \anchor VideoPlayer_HasEpg
3019 /// @return **True** if epg information is available for the currently playing
3020 /// programme (PVR).
3023 /// \table_row3{ <b>`VideoPlayer.CanResumeLiveTV`</b>,
3024 /// \anchor VideoPlayer_CanResumeLiveTV
3026 /// @return **True** if a in-progress PVR recording is playing an the respective
3027 /// live TV channel is available.
3030 /// \table_row3{ <b>`VideoPlayer.Title`</b>,
3031 /// \anchor VideoPlayer_Title
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.
3037 /// \table_row3{ <b>`VideoPlayer.offset(number).Title`</b>,
3038 /// \anchor VideoPlayer_Offset_Title
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.
3043 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Title `VideoPlayer.offset(number).Title`\endlink
3046 /// \table_row3{ <b>`VideoPlayer.position(number).Title`</b>,
3047 /// \anchor VideoPlayer_Position_Title
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.
3052 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Title `VideoPlayer.position(number).Title`\endlink
3055 /// \table_row3{ <b>`VideoPlayer.OriginalTitle`</b>,
3056 /// \anchor VideoPlayer_OriginalTitle
3058 /// @return The original title of currently playing video. If it's in the database.
3061 /// \table_row3{ <b>`VideoPlayer.offset(number).OriginalTitle`</b>,
3062 /// \anchor VideoPlayer_Offset_OriginalTitle
3064 /// @return The original title of the video which has an offset `number` with respect to the currently playing video.
3066 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_OriginalTitle `VideoPlayer.offset(number).OriginalTitle`\endlink
3069 /// \table_row3{ <b>`VideoPlayer.position(number).OriginalTitle`</b>,
3070 /// \anchor VideoPlayer_Position_OriginalTitle
3072 /// @return The original title of the video which has an offset `number` with respect to the start of the playlist.
3074 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_OriginalTitle `VideoPlayer.position(number).OriginalTitle`\endlink
3077 /// \table_row3{ <b>`VideoPlayer.TVShowTitle`</b>,
3078 /// \anchor VideoPlayer_TVShowTitle
3080 /// @return The title of currently playing episode's tvshow name.
3083 /// \table_row3{ <b>`VideoPlayer.offset(number).TVShowTitle`</b>,
3084 /// \anchor VideoPlayer_Offset_TVShowTitle
3086 /// @return The title of the episode's tvshow name which has an offset `number` with respect to the currently playing video.
3088 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_TVShowTitle `VideoPlayer.offset(number).TVShowTitle`\endlink
3091 /// \table_row3{ <b>`VideoPlayer.position(number).TVShowTitle`</b>,
3092 /// \anchor VideoPlayer_Position_TVShowTitle
3094 /// @return The title of the episode's tvshow name which has an offset `number` with respect to the start of the playlist.
3096 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_TVShowTitle `VideoPlayer.position(number).TVShowTitle`\endlink
3099 /// \table_row3{ <b>`VideoPlayer.Season`</b>,
3100 /// \anchor VideoPlayer_Season
3102 /// @return The season number of the currently playing episode\, if it's in the database.
3104 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Season `VideoPlayer.Season`\endlink
3105 /// also supports EPG.
3108 /// \table_row3{ <b>`VideoPlayer.offset(number).Season`</b>,
3109 /// \anchor VideoPlayer_Offset_Season
3111 /// @return The season number of the episode which has an offset `number` with respect to the currently playing video.
3113 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Season `VideoPlayer.offset(number).Season`\endlink
3116 /// \table_row3{ <b>`VideoPlayer.position(number).Season`</b>,
3117 /// \anchor VideoPlayer_Position_Season
3119 /// @return The season number of the episode which has an offset `number` with respect to the start of the playlist.
3121 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Season `VideoPlayer.position(number).Season`\endlink
3124 /// \table_row3{ <b>`VideoPlayer.Episode`</b>,
3125 /// \anchor VideoPlayer_Episode
3127 /// @return The episode number of the currently playing episode.
3129 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Episode `VideoPlayer.Episode`\endlink
3130 /// also supports EPG.
3133 /// \table_row3{ <b>`VideoPlayer.offset(number).Episode`</b>,
3134 /// \anchor VideoPlayer_Offset_Episode
3136 /// @return The episode number of the episode which has an offset `number` with respect to the currently playing video.
3138 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Episode `VideoPlayer.offset(number).Episode`\endlink
3141 /// \table_row3{ <b>`VideoPlayer.position(number).Episode`</b>,
3142 /// \anchor VideoPlayer_Position_Episode
3144 /// @return The episode number of the episode which has an offset `number` with respect to the start of the playlist.
3146 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Episode `VideoPlayer.position(number).Episode`\endlink
3149 /// \table_row3{ <b>`VideoPlayer.Genre`</b>,
3150 /// \anchor VideoPlayer_Genre
3152 /// @return The genre(s) of current movie\, if it's in the database.
3155 /// \table_row3{ <b>`VideoPlayer.offset(number).Genre`</b>,
3156 /// \anchor VideoPlayer_Offset_Genre
3158 /// @return The genre(s) of the video which has an offset `number` with respect to the currently playing video.
3160 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Genre `VideoPlayer.offset(number).Genre`\endlink
3163 /// \table_row3{ <b>`VideoPlayer.position(number).Genre`</b>,
3164 /// \anchor VideoPlayer_Position_Genre
3166 /// @return The genre(s) of the video which has an offset `number` with respect to the start of the playlist.
3168 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Genre `VideoPlayer.position(number).Genre`\endlink
3171 /// \table_row3{ <b>`VideoPlayer.Director`</b>,
3172 /// \anchor VideoPlayer_Director
3174 /// @return The director of current movie\, if it's in the database.
3176 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Director `VideoPlayer.Director`\endlink
3177 /// also supports EPG.
3180 /// \table_row3{ <b>`VideoPlayer.offset(number).Director`</b>,
3181 /// \anchor VideoPlayer_Offset_Director
3183 /// @return The director of the video which has an offset `number` with respect to the currently playing video.
3185 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Director `VideoPlayer.offset(number).VideoPlayer_Offset_Director`\endlink
3188 /// \table_row3{ <b>`VideoPlayer.position(number).Director`</b>,
3189 /// \anchor VideoPlayer_Position_Director
3191 /// @return The director of the video which has an offset `number` with respect to the start of the playlist.
3193 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Director `VideoPlayer.position(number).Director`\endlink
3196 /// \table_row3{ <b>`VideoPlayer.Country`</b>,
3197 /// \anchor VideoPlayer_Country
3199 /// @return The production country of current movie\, if it's in the database.
3202 /// \table_row3{ <b>`VideoPlayer.offset(number).Country`</b>,
3203 /// \anchor VideoPlayer_Offset_Country
3205 /// @return The production country of the video which has an offset `number` with respect to the currently playing video.
3207 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Country `VideoPlayer.offset(number).Country`\endlink
3210 /// \table_row3{ <b>`VideoPlayer.position(number).Country`</b>,
3211 /// \anchor VideoPlayer_Position_Country
3213 /// @return The production country of the video which has an offset `number` with respect to the start of the playlist.
3215 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Country `VideoPlayer.position(number).Country`\endlink
3218 /// \table_row3{ <b>`VideoPlayer.Year`</b>,
3219 /// \anchor VideoPlayer_Year
3221 /// @return The year of release of current movie\, if it's in the database.
3224 /// \table_row3{ <b>`VideoPlayer.offset(number).Year`</b>,
3225 /// \anchor VideoPlayer_Offset_Year
3227 /// @return The year of release of the video which has an offset `number` with respect to the currently playing video.
3229 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Year `VideoPlayer.offset(number).Year`\endlink
3232 /// \table_row3{ <b>`VideoPlayer.position(number).Year`</b>,
3233 /// \anchor VideoPlayer_Position_Year
3235 /// @return The year of release of the video which has an offset `number` with respect to the start of the playlist.
3237 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Year `VideoPlayer.position(number).Year`\endlink
3240 /// \table_row3{ <b>`VideoPlayer.Cover`</b>,
3241 /// \anchor VideoPlayer_Cover
3243 /// @return The cover of currently playing movie.
3246 /// \table_row3{ <b>`VideoPlayer.offset(number).Cover`</b>,
3247 /// \anchor VideoPlayer_Offset_Cover
3249 /// @return The cover of the video which has an offset `number` with respect to the currently playing video.
3251 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Cover `VideoPlayer.offset(number).Cover`\endlink
3254 /// \table_row3{ <b>`VideoPlayer.position(number).Cover`</b>,
3255 /// \anchor VideoPlayer_Position_Cover
3257 /// @return The cover of the video which has an offset `number` with respect to the start of the playlist.
3259 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Cover `VideoPlayer.position(number).Cover`\endlink
3262 /// \table_row3{ <b>`VideoPlayer.Rating`</b>,
3263 /// \anchor VideoPlayer_Rating
3265 /// @return The scraped rating of current movie\, if it's in the database.
3268 /// \table_row3{ <b>`VideoPlayer.offset(number).Rating`</b>,
3269 /// \anchor VideoPlayer_Offset_Rating
3271 /// @return The scraped rating of the video which has an offset `number` with respect to the currently playing video.
3273 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Rating `VideoPlayer.offset(number).Rating`\endlink
3276 /// \table_row3{ <b>`VideoPlayer.position(number).Rating`</b>,
3277 /// \anchor VideoPlayer_Position_Rating
3279 /// @return The scraped rating of the video which has an offset `number` with respect to the start of the playlist.
3281 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Rating `VideoPlayer.position(number).Rating`\endlink
3284 /// \table_row3{ <b>`VideoPlayer.UserRating`</b>,
3285 /// \anchor VideoPlayer_UserRating
3287 /// @return The user rating of the currently playing item.
3289 /// @skinning_v16 **[New Infolabel]** \link VideoPlayer_UserRating `VideoPlayer.UserRating`\endlink
3292 /// \table_row3{ <b>`VideoPlayer.offset(number).UserRating`</b>,
3293 /// \anchor VideoPlayer_Offset_UserRating
3295 /// @return The user rating of the video which has an offset `number` with respect to the currently playing video.
3297 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_UserRating `VideoPlayer.offset(number).UserRating`\endlink
3300 /// \table_row3{ <b>`VideoPlayer.position(number).UserRating`</b>,
3301 /// \anchor VideoPlayer_Position_UserRating
3303 /// @return The user rating of the video which has an offset `number` with respect to the start of the playlist.
3305 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_UserRating `VideoPlayer.position(number).UserRating`\endlink
3308 /// \table_row3{ <b>`VideoPlayer.Votes`</b>,
3309 /// \anchor VideoPlayer_Votes
3311 /// @return The scraped votes of current movie\, if it's in the database.
3313 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_Votes `VideoPlayer.Votes`\endlink
3316 /// \table_row3{ <b>`VideoPlayer.offset(number).Votes`</b>,
3317 /// \anchor VideoPlayer_Offset_Votes
3319 /// @return The scraped votes of the video which has an offset `number` with respect to the currently playing video.
3321 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Votes `VideoPlayer.offset(number).Votes`\endlink
3324 /// \table_row3{ <b>`VideoPlayer.position(number).Votes`</b>,
3325 /// \anchor VideoPlayer_Position_Votes
3327 /// @return The scraped votes of the video which has an offset `number` with respect to the start of the playlist.
3329 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Votes `VideoPlayer.position(number).Votes`\endlink
3332 /// \table_row3{ <b>`VideoPlayer.RatingAndVotes`</b>,
3333 /// \anchor VideoPlayer_RatingAndVotes
3335 /// @return The scraped rating and votes of current movie\, if it's in the database
3338 /// \table_row3{ <b>`VideoPlayer.offset(number).RatingAndVotes`</b>,
3339 /// \anchor VideoPlayer_Offset_RatingAndVotes
3341 /// @return The scraped rating and votes of the video which has an offset `number` with respect to the currently playing video.
3343 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_RatingAndVotes `VideoPlayer.offset(number).RatingAndVotes`\endlink
3346 /// \table_row3{ <b>`VideoPlayer.position(number).RatingAndVotes`</b>,
3347 /// \anchor VideoPlayer_Position_RatingAndVotes
3349 /// @return The scraped rating and votes of the video which has an offset `number` with respect to the start of the playlist.
3351 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_RatingAndVotes `VideoPlayer.position(number).RatingAndVotes`\endlink
3354 /// \table_row3{ <b>`VideoPlayer.mpaa`</b>,
3355 /// \anchor VideoPlayer_mpaa
3357 /// @return The MPAA rating of current movie\, if it's in the database.
3360 /// \table_row3{ <b>`VideoPlayer.offset(number).mpaa`</b>,
3361 /// \anchor VideoPlayer_Offset_mpaa
3363 /// @return The MPAA rating of the video which has an offset `number` with respect to the currently playing video.
3365 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_mpaa `VideoPlayer.offset(number).mpaa`\endlink
3368 /// \table_row3{ <b>`VideoPlayer.position(number).mpaa`</b>,
3369 /// \anchor VideoPlayer_Position_mpaa
3371 /// @return The MPAA rating of the video which has an offset `number` with respect to the start of the playlist.
3373 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_mpaa `VideoPlayer.position(number).mpaa`\endlink
3376 /// \table_row3{ <b>`VideoPlayer.Art(type)`</b>,
3377 /// \anchor VideoPlayer_art
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)
3382 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_art `VideoPlayer.Art(type)`\endlink
3385 /// \table_row3{ <b>`VideoPlayer.offset(number).Art(type)`</b>,
3386 /// \anchor VideoPlayer_Offset_art
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)
3392 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_Offset_mpaa `VideoPlayer.offset(number).Art(type)`\endlink
3395 /// \table_row3{ <b>`VideoPlayer.position(number).Art(type)`</b>,
3396 /// \anchor VideoPlayer_position_art
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)
3402 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_position_art `VideoPlayer.position(number).Art(type)`\endlink
3405 /// \table_row3{ <b>`VideoPlayer.IMDBNumber`</b>,
3406 /// \anchor VideoPlayer_IMDBNumber
3408 /// @return The IMDb ID of the current movie\, if it's in the database.
3410 /// @skinning_v15 **[New Infolabel]** \link VideoPlayer_IMDBNumber `VideoPlayer.IMDBNumber`\endlink
3413 /// \table_row3{ <b>`VideoPlayer.offset(number).IMDBNumber`</b>,
3414 /// \anchor VideoPlayer_Offset_IMDBNumber
3416 /// @return The IMDb ID of the the video which has an offset `number` with respect to the currently playing video.
3418 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_IMDBNumber `VideoPlayer.offset(number).IMDBNumber`\endlink
3421 /// \table_row3{ <b>`VideoPlayer.position(number).IMDBNumber`</b>,
3422 /// \anchor VideoPlayer_Position_IMDBNumber
3424 /// @return The IMDb ID of the video which has an offset `number` with respect to the start of the playlist.
3426 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_IMDBNumber `VideoPlayer.position(number).IMDBNumber`\endlink
3429 /// \table_row3{ <b>`VideoPlayer.Top250`</b>,
3430 /// \anchor VideoPlayer_Top250
3432 /// @return The IMDb Top250 position of the currently playing movie\, if it's in the database.
3435 /// \table_row3{ <b>`VideoPlayer.offset(number).Top250`</b>,
3436 /// \anchor VideoPlayer_Offset_Top250
3438 /// @return The IMDb Top250 position of the video which has an offset `number` with respect to the currently playing video.
3440 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Top250 `VideoPlayer.offset(number).Top250`\endlink
3443 /// \table_row3{ <b>`VideoPlayer.position(number).Top250`</b>,
3444 /// \anchor VideoPlayer_Position_Top250
3446 /// @return The IMDb Top250 position of the video which has an offset `number` with respect to the start of the playlist.
3448 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Top250 `VideoPlayer.position(number).Top250`\endlink
3451 /// \table_row3{ <b>`VideoPlayer.EpisodeName`</b>,
3452 /// \anchor VideoPlayer_EpisodeName
3454 /// @return The name of the episode if the playing video is a TV Show\,
3455 /// if it's in the database (PVR).
3457 /// @skinning_v15 **[New Infolabel]** \link VideoPlayer_EpisodeName `VideoPlayer.EpisodeName`\endlink
3460 /// \table_row3{ <b>`VideoPlayer.PlaylistPosition`</b>,
3461 /// \anchor VideoPlayer_PlaylistPosition
3463 /// @return The position of the current song in the current video playlist.
3466 /// \table_row3{ <b>`VideoPlayer.PlaylistLength`</b>,
3467 /// \anchor VideoPlayer_PlaylistLength
3469 /// @return The total size of the current video playlist.
3472 /// \table_row3{ <b>`VideoPlayer.Cast`</b>,
3473 /// \anchor VideoPlayer_Cast
3475 /// @return A list of cast members\, separated by carriage returns.
3477 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Cast `VideoPlayer.Cast`\endlink
3478 /// also supports EPG.
3481 /// \table_row3{ <b>`VideoPlayer.CastAndRole`</b>,
3482 /// \anchor VideoPlayer_CastAndRole
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.
3488 /// \table_row3{ <b>`VideoPlayer.Album`</b>,
3489 /// \anchor VideoPlayer_Album
3491 /// @return The album from which the current Music Video is from\, if it's in the database.
3494 /// \table_row3{ <b>`VideoPlayer.offset(number).Album`</b>,
3495 /// \anchor VideoPlayer_Offset_Album
3497 /// @return The album from which the video which has an offset `number` with respect to the currently playing video.
3499 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Album `VideoPlayer.offset(number).Album`\endlink
3502 /// \table_row3{ <b>`VideoPlayer.position(number).Album`</b>,
3503 /// \anchor VideoPlayer_Position_Album
3505 /// @return The album from which the music video which has an offset `number` with respect to the start of the playlist.
3507 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Album `VideoPlayer.position(number).Album`\endlink
3510 /// \table_row3{ <b>`VideoPlayer.Artist`</b>,
3511 /// \anchor VideoPlayer_Artist
3513 /// @return The artist(s) of current Music Video\, if it's in the database.
3516 /// \table_row3{ <b>`VideoPlayer.offset(number).Artist`</b>,
3517 /// \anchor VideoPlayer_Offset_Artist
3519 /// @return The artist(s) of the video which has an offset `number` with respect to the currently playing video.
3521 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Artist `VideoPlayer.offset(number).Artist`\endlink
3524 /// \table_row3{ <b>`VideoPlayer.position(number).Artist`</b>,
3525 /// \anchor VideoPlayer_Position_Artist
3527 /// @return The artist(s) of the music video which has an offset `number` with respect to the start of the playlist.
3529 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Artist `VideoPlayer.position(number).Artist`\endlink
3532 /// \table_row3{ <b>`VideoPlayer.Studio`</b>,
3533 /// \anchor VideoPlayer_Studio
3535 /// @return The studio of current Music Video\, if it's in the database.
3538 /// \table_row3{ <b>`VideoPlayer.offset(number).Studio`</b>,
3539 /// \anchor VideoPlayer_Offset_Studio
3541 /// @return The studio of the video which has an offset `number` with respect to the currently playing video.
3543 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Studio `VideoPlayer.offset(number).Studio`\endlink
3546 /// \table_row3{ <b>`VideoPlayer.position(number).Studio`</b>,
3547 /// \anchor VideoPlayer_Position_Studio
3549 /// @return The studio of the video which has an offset `number` with respect to the start of the playlist.
3551 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Studio `VideoPlayer.position(number).Studio`\endlink
3554 /// \table_row3{ <b>`VideoPlayer.Writer`</b>,
3555 /// \anchor VideoPlayer_Writer
3557 /// @return The name of Writer of current playing Video\, if it's in the database.
3559 /// @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Writer `VideoPlayer.Writer`\endlink
3560 /// also supports EPG.
3563 /// \table_row3{ <b>`VideoPlayer.offset(number).Writer`</b>,
3564 /// \anchor VideoPlayer_Offset_Writer
3566 /// @return The name of Writer of the video which has an offset `number` with respect to the currently playing video.
3568 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Writer `VideoPlayer.offset(number).Writer`\endlink
3571 /// \table_row3{ <b>`VideoPlayer.position(number).Writer`</b>,
3572 /// \anchor VideoPlayer_Position_Writer
3574 /// @return The name of Writer of the video which has an offset `number` with respect to the start of the playlist.
3576 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Writer `VideoPlayer.position(number).Writer`\endlink
3579 /// \table_row3{ <b>`VideoPlayer.Tagline`</b>,
3580 /// \anchor VideoPlayer_Tagline
3582 /// @return The small Summary of current playing Video\, if it's in the database.
3585 /// \table_row3{ <b>`VideoPlayer.offset(number).Tagline`</b>,
3586 /// \anchor VideoPlayer_Offset_Tagline
3588 /// @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3590 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Tagline `VideoPlayer.offset(number).Tagline`\endlink
3593 /// \table_row3{ <b>`VideoPlayer.position(number).Tagline`</b>,
3594 /// \anchor VideoPlayer_Position_Tagline
3596 /// @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3598 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Tagline `VideoPlayer.position(number).Tagline`\endlink
3601 /// \table_row3{ <b>`VideoPlayer.PlotOutline`</b>,
3602 /// \anchor VideoPlayer_PlotOutline
3604 /// @return The small Summary of current playing Video\, if it's in the database.
3607 /// \table_row3{ <b>`VideoPlayer.offset(number).PlotOutline`</b>,
3608 /// \anchor VideoPlayer_Offset_PlotOutline
3610 /// @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3612 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlotOutline `VideoPlayer.offset(number).PlotOutline`\endlink
3615 /// \table_row3{ <b>`VideoPlayer.position(number).PlotOutline`</b>,
3616 /// \anchor VideoPlayer_Position_PlotOutline
3618 /// @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3620 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlotOutline `VideoPlayer.position(number).PlotOutline`\endlink
3623 /// \table_row3{ <b>`VideoPlayer.Plot`</b>,
3624 /// \anchor VideoPlayer_Plot
3626 /// @return The complete Text Summary of current playing Video\, if it's in the database.
3629 /// \table_row3{ <b>`VideoPlayer.offset(number).Plot`</b>,
3630 /// \anchor VideoPlayer_Offset_Plot
3632 /// @return The complete Text Summary of the video which has an offset `number` with respect to the currently playing video.
3634 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Plot `VideoPlayer.offset(number).Plot`\endlink
3637 /// \table_row3{ <b>`VideoPlayer.position(number).Plot`</b>,
3638 /// \anchor VideoPlayer_Position_Plot
3640 /// @return The complete Text Summary of the video which has an offset `number` with respect to the start of the playlist.
3642 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Plot `VideoPlayer.position(number).Plot`\endlink
3645 /// \table_row3{ <b>`VideoPlayer.Premiered`</b>,
3646 /// \anchor VideoPlayer_Premiered
3648 /// @return The release or aired date of the currently playing episode\, show\, movie or EPG item\,
3649 /// if it's in the database.
3652 /// \table_row3{ <b>`VideoPlayer.offset(number).Premiered`</b>,
3653 /// \anchor VideoPlayer_Offset_Premiered
3655 /// @return The release or aired date of the video which has an offset `number` with respect to the currently playing video.
3657 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Premiered `VideoPlayer.offset(number).Premiered`\endlink
3660 /// \table_row3{ <b>`VideoPlayer.position(number).Premiered`</b>,
3661 /// \anchor VideoPlayer_Position_Premiered
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.
3666 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Premiered `VideoPlayer.position(number).Premiered`\endlink
3669 /// \table_row3{ <b>`VideoPlayer.Trailer`</b>,
3670 /// \anchor VideoPlayer_Trailer
3672 /// @return The path to the trailer of the currently playing movie\, if it's in the database.
3675 /// \table_row3{ <b>`VideoPlayer.offset(number).Trailer`</b>,
3676 /// \anchor VideoPlayer_Offset_Trailer
3678 /// @return The path to the trailer of the video which has an offset `number` with respect to the currently playing video.
3680 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Trailer `VideoPlayer.offset(number).Title`\endlink
3683 /// \table_row3{ <b>`VideoPlayer.position(number).Trailer`</b>,
3684 /// \anchor VideoPlayer_Position_Trailer
3686 /// @return The path to the trailer of the video which has an offset `number` with respect to the start of the playlist.
3688 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Trailer `VideoPlayer.position(number).Trailer`\endlink
3691 /// \table_row3{ <b>`VideoPlayer.LastPlayed`</b>,
3692 /// \anchor VideoPlayer_LastPlayed
3694 /// @return The last play date of current playing Video\, if it's in the database.
3697 /// \table_row3{ <b>`VideoPlayer.offset(number).LastPlayed`</b>,
3698 /// \anchor VideoPlayer_Offset_LastPlayed
3700 /// @return The last play date of the video which has an offset `number` with respect to the currently playing video.
3702 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_LastPlayed `VideoPlayer.offset(number).LastPlayed`\endlink
3705 /// \table_row3{ <b>`VideoPlayer.position(number).LastPlayed`</b>,
3706 /// \anchor VideoPlayer_Position_LastPlayed
3708 /// @return The last play date of the video which has an offset `number` with respect to the start of the playlist.
3710 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_LastPlayed `VideoPlayer.position(number).LastPlayed`\endlink
3713 /// \table_row3{ <b>`VideoPlayer.PlayCount`</b>,
3714 /// \anchor VideoPlayer_PlayCount
3716 /// @return The playcount of current playing Video\, if it's in the database.
3719 /// \table_row3{ <b>`VideoPlayer.offset(number).PlayCount`</b>,
3720 /// \anchor VideoPlayer_Offset_PlayCount
3722 /// @return The playcount of the video which has an offset `number` with respect to the currently playing video.
3724 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlayCount `VideoPlayer.offset(number).PlayCount`\endlink
3727 /// \table_row3{ <b>`VideoPlayer.position(number).PlayCount`</b>,
3728 /// \anchor VideoPlayer_Position_PlayCount
3730 /// @return The playcount of the video which has an offset `number` with respect to the start of the playlist.
3732 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlayCount `VideoPlayer.position(number).PlayCount`\endlink
3735 /// \table_row3{ <b>`VideoPlayer.VideoCodec`</b>,
3736 /// \anchor VideoPlayer_VideoCodec
3738 /// @return The video codec of the currently playing video (common values: see
3739 /// \ref ListItem_VideoCodec "ListItem.VideoCodec").
3742 /// \table_row3{ <b>`VideoPlayer.VideoResolution`</b>,
3743 /// \anchor VideoPlayer_VideoResolution
3745 /// @return The video resolution of the currently playing video (possible
3746 /// values: see \ref ListItem_VideoResolution "ListItem.VideoResolution").
3749 /// \table_row3{ <b>`VideoPlayer.VideoAspect`</b>,
3750 /// \anchor VideoPlayer_VideoAspect
3752 /// @return The aspect ratio of the currently playing video (possible values:
3753 /// see \ref ListItem_VideoAspect "ListItem.VideoAspect").
3756 /// \table_row3{ <b>`VideoPlayer.AudioCodec`</b>,
3757 /// \anchor VideoPlayer_AudioCodec
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").
3764 /// \table_row3{ <b>`VideoPlayer.AudioChannels`</b>,
3765 /// \anchor VideoPlayer_AudioChannels
3767 /// @return The number of audio channels of the currently playing video
3768 /// (possible values: see \ref ListItem_AudioChannels "ListItem.AudioChannels").
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)
3775 /// \table_row3{ <b>`VideoPlayer.AudioLanguage`</b>,
3776 /// \anchor VideoPlayer_AudioLanguage
3778 /// @return The language of the audio of the currently playing video(possible
3779 /// values: see \ref ListItem_AudioLanguage "ListItem.AudioLanguage").
3781 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_AudioLanguage `VideoPlayer.AudioLanguage`\endlink
3784 /// \table_row3{ <b>`VideoPlayer.SubtitlesLanguage`</b>,
3785 /// \anchor VideoPlayer_SubtitlesLanguage
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
3792 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_SubtitlesLanguage `VideoPlayer.SubtitlesLanguage`\endlink
3795 /// \table_row3{ <b>`VideoPlayer.StereoscopicMode`</b>,
3796 /// \anchor VideoPlayer_StereoscopicMode
3798 /// @return The stereoscopic mode of the currently playing video (possible
3799 /// values: see \ref ListItem_StereoscopicMode "ListItem.StereoscopicMode").
3801 /// @skinning_v13 **[New Infolabel]** \link VideoPlayer_StereoscopicMode `VideoPlayer.StereoscopicMode`\endlink
3804 /// \table_row3{ <b>`VideoPlayer.StartTime`</b>,
3805 /// \anchor VideoPlayer_StartTime
3807 /// @return The start date and time of the currently playing epg event or recording (PVR).
3810 /// \table_row3{ <b>`VideoPlayer.EndTime`</b>,
3811 /// \anchor VideoPlayer_EndTime
3813 /// @return The end date and time of the currently playing epg event or recording (PVR).
3816 /// \table_row3{ <b>`VideoPlayer.NextTitle`</b>,
3817 /// \anchor VideoPlayer_NextTitle
3819 /// @return The title of the programme that will be played next (PVR).
3822 /// \table_row3{ <b>`VideoPlayer.NextGenre`</b>,
3823 /// \anchor VideoPlayer_NextGenre
3825 /// @return The genre of the programme that will be played next (PVR).
3828 /// \table_row3{ <b>`VideoPlayer.NextPlot`</b>,
3829 /// \anchor VideoPlayer_NextPlot
3831 /// @return The plot of the programme that will be played next (PVR).
3834 /// \table_row3{ <b>`VideoPlayer.NextPlotOutline`</b>,
3835 /// \anchor VideoPlayer_NextPlotOutline
3837 /// @return The plot outline of the programme that will be played next (PVR).
3840 /// \table_row3{ <b>`VideoPlayer.NextStartTime`</b>,
3841 /// \anchor VideoPlayer_NextStartTime
3843 /// @return The start time of the programme that will be played next (PVR).
3846 /// \table_row3{ <b>`VideoPlayer.NextEndTime`</b>,
3847 /// \anchor VideoPlayer_NextEndTime
3849 /// @return The end time of the programme that will be played next (PVR).
3852 /// \table_row3{ <b>`VideoPlayer.NextDuration`</b>,
3853 /// \anchor VideoPlayer_NextDuration
3855 /// @return The duration of the programme that will be played next (PVR).
3858 /// \table_row3{ <b>`VideoPlayer.ChannelName`</b>,
3859 /// \anchor VideoPlayer_ChannelName
3861 /// @return The name of the currently tuned channel (PVR).
3864 /// \table_row3{ <b>`VideoPlayer.ChannelLogo`</b>,
3865 /// \anchor VideoPlayer_ChannelLogo
3867 /// @return The path for the logo of the currently playing TV channel\, if available (PVR).
3869 /// @skinning_v22 **[New Infolabel]** \link VideoPlayer_ChannelLogo `VideoPlayer.ChannelLogo`\endlink
3872 /// \table_row3{ <b>`VideoPlayer.ChannelNumberLabel`</b>,
3873 /// \anchor VideoPlayer_ChannelNumberLabel
3875 /// @return The channel and subchannel number of the tv channel that's currently playing (PVR).
3877 /// @skinning_v14 **[New Infolabel]** \link VideoPlayer_ChannelNumberLabel `VideoPlayer.ChannelNumberLabel`\endlink
3880 /// \table_row3{ <b>`VideoPlayer.ChannelGroup`</b>,
3881 /// \anchor VideoPlayer_ChannelGroup
3883 /// @return The group of the currently tuned channel (PVR).
3886 /// \table_row3{ <b>`VideoPlayer.ParentalRating`</b>,
3887 /// \anchor VideoPlayer_ParentalRating
3889 /// @return The parental rating of the currently playing programme (PVR).
3892 /// \table_row3{ <b>`VideoPlayer.DBID`</b>,
3893 /// \anchor VideoPlayer_DBID
3895 /// @return The database id of the currently playing video
3897 /// @skinning_v17 **[New Infolabel]** \link VideoPlayer_DBID `VideoPlayer.DBID`\endlink
3900 /// \table_row3{ <b>`VideoPlayer.offset(number).DBID`</b>,
3901 /// \anchor VideoPlayer_Offset_DBID
3903 /// @return The database id of the video which has an offset `number` with respect to the currently playing video.
3905 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_DBID `VideoPlayer.offset(number).DBID`\endlink
3908 /// \table_row3{ <b>`VideoPlayer.position(number).DBID`</b>,
3909 /// \anchor VideoPlayer_Position_DBID
3911 /// @return The database id of the video which has an offset `number` with respect to the start of the playlist.
3913 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_DBID `VideoPlayer.position(number).DBID`\endlink
3916 /// \table_row3{ <b>`VideoPlayer.UniqueID(name)`</b>,
3917 /// \anchor VideoPlayer_UniqueID
3919 /// @return The scraped metadata id of current movie\, if it's in the database.
3920 /// @param name - the name of the metadata provider.
3922 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_UniqueID `VideoPlayer.UniqueID(name)`\endlink
3925 /// \table_row3{ <b>`VideoPlayer.TvShowDBID`</b>,
3926 /// \anchor VideoPlayer_TvShowDBID
3928 /// @return The database id of the TvShow for the currently playing Episode
3930 /// @skinning_v19 **[New Infolabel]** \link VideoPlayer_TvShowDBID `VideoPlayer.TvShowDBID`\endlink
3933 /// \table_row3{ <b>`VideoPlayer.AudioStreamCount`</b>,
3934 /// \anchor VideoPlayer_AudioStreamCount
3936 /// @return The number of audio streams of the currently playing video.
3937 /// @note If the video contains no audio streams it returns 0.
3939 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_AudioStreamCount `VideoPlayer.AudioStreamCount`\endlink
3942 /// \table_row3{ <b>`VideoPlayer.HdrType`</b>,
3943 /// \anchor VideoPlayer_HdrType
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.
3947 /// @skinning_v20 **[New Infolabel]** \link VideoPlayer_HdrType `VideoPlayer.HdrType`\endlink
3950 /// \table_row3{ <b>`VideoPlayer.VideoVersionName`</b>,
3951 /// \anchor VideoPlayer_VideoVersionName
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
3955 /// @skinning_v21 **[New Infolabel]** \link VideoPlayer_VideoVersionName `VideoPlayer.VideoVersionName`\endlink
3959 /// -----------------------------------------------------------------------------
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
}
4039 /// \page modules__infolabels_boolean_conditions
4040 /// \subsection modules__infolabels_boolean_conditions_RetroPlayer RetroPlayer
4042 /// \table_h3{ Labels, Type, Description }
4043 /// \table_row3{ <b>`RetroPlayer.VideoFilter`</b>,
4044 /// \anchor RetroPlayer_VideoFilter
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)
4051 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoFilter `RetroPlayer.VideoFilter`\endlink
4054 /// \table_row3{ <b>`RetroPlayer.StretchMode`</b>,
4055 /// \anchor RetroPlayer_StretchMode
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)
4064 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_StretchMode `RetroPlayer.StretchMode`\endlink
4067 /// \table_row3{ <b>`RetroPlayer.VideoRotation`</b>,
4068 /// \anchor RetroPlayer_VideoRotation
4070 /// @return The video rotation of the currently-playing game
4071 /// in degrees counter-clockwise.
4072 /// The following values are possible:
4074 /// - <b>`90`</b> (Shown in the GUI as 270 degrees)
4076 /// - <b>`270`</b> (Shown in the GUI as 90 degrees)
4078 /// @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoRotation `RetroPlayer.VideoRotation`\endlink
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
4094 /// \table_h3{ Labels, Type, Description }
4095 /// \table_row3{ <b>`Container.HasFiles`</b>,
4096 /// \anchor Container_HasFiles
4098 /// @return **True** if the container contains files.
4101 /// \table_row3{ <b>`Container.HasFolders`</b>,
4102 /// \anchor Container_HasFolders
4104 /// @return **True** if the container contains folders.
4107 /// \table_row3{ <b>`Container.IsStacked`</b>,
4108 /// \anchor Container_IsStacked
4110 /// @return **True** if the container is currently in stacked mode.
4113 /// \table_row3{ <b>`Container.FolderPath`</b>,
4114 /// \anchor Container_FolderPath
4116 /// @return The complete path of currently displayed folder.
4119 /// \table_row3{ <b>`Container.FolderName`</b>,
4120 /// \anchor Container_FolderName
4122 /// @return The top most folder in currently displayed folder.
4125 /// \table_row3{ <b>`Container.PluginName`</b>,
4126 /// \anchor Container_PluginName
4128 /// @return The current plugins base folder name.
4131 /// \table_row3{ <b>`Container.PluginCategory`</b>,
4132 /// \anchor Container_PluginCategory
4134 /// @return The current plugins category (set by the scripter).
4136 /// @skinning_v17 **[New Infolabel]** \link Container_PluginCategory `Container.PluginCategory`\endlink
4139 /// \table_row3{ <b>`Container.Viewmode`</b>,
4140 /// \anchor Container_Viewmode
4142 /// @return The current viewmode (list\, icons etc).
4145 /// \table_row3{ <b>`Container.ViewCount`</b>,
4146 /// \anchor Container_ViewCount
4148 /// @return The number of available skin view modes for the current container listing.
4150 /// @skinning_v17 **[New Infolabel]** \link Container_ViewCount `Container.ViewCount`\endlink
4153 /// \table_row3{ <b>`Container.Totaltime`</b>,
4154 /// \anchor Container_Totaltime
4156 /// @return The total time of all items in the current container.
4159 /// \table_row3{ <b>`Container.TotalWatched`</b>,
4160 /// \anchor Container_TotalWatched
4162 /// @return The number of watched items in the container.
4163 /// @param id - [opt] if not supplied the current container will be used.
4165 /// @skinning_v16 **[New Infolabel]** \link Container_TotalWatched `Container(id).TotalWatched`\endlink
4168 /// \table_row3{ <b>`Container.TotalUnWatched`</b>,
4169 /// \anchor Container_TotalUnWatched
4171 /// @return The number of unwatched items in the container.
4172 /// @param id - [opt] if not supplied the current container will be used.
4174 /// @skinning_v16 **[New Infolabel]** \link Container_TotalUnWatched `Container(id).TotalUnWatched`\endlink
4177 /// \table_row3{ <b>`Container.HasThumb`</b>,
4178 /// \anchor Container_HasThumb
4180 /// @return **True** if the current container you are in has a thumb assigned
4184 /// \table_row3{ <b>`Container.SortOrder`</b>,
4185 /// \anchor Container_SortOrder
4187 /// @return The current sort order (Ascending/Descending).
4189 /// @skinning_v16 **[New Infolabel]** \link Container_SortOrder `Container.SortOrder`\endlink
4192 /// \table_row3{ <b>`Container.CanFilter`</b>,
4193 /// \anchor Container_CanFilter
4195 /// @return **True** when the current container can be filtered.
4198 /// \table_row3{ <b>`Container.CanFilterAdvanced`</b>,
4199 /// \anchor Container_CanFilterAdvanced
4201 /// @return **True** when advanced filtering can be applied to the current container.
4204 /// \table_row3{ <b>`Container.Filtered`</b>,
4205 /// \anchor Container_Filtered
4207 /// @return **True** when a mediafilter is applied to the current container.
4210 /// \table_row3{ <b>`Container.ShowPlot`</b>,
4211 /// \anchor Container_ShowPlot
4213 /// @return The TV Show plot of the current container and can be used at
4214 /// season and episode level.
4217 /// \table_row3{ <b>`Container.ShowTitle`</b>,
4218 /// \anchor Container_ShowTitle
4220 /// @return The TV Show title of the current container and can be used at
4221 /// season and episode level.
4223 /// @skinning_v17 **[New Infolabel]** \link Container_ShowTitle `Container.ShowTitle`\endlink
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
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.)
4255 /// \table_row3{ <b>`Container(id).OnScrollNext`</b>,
4256 /// \anchor Container_OnScrollNext
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.
4263 /// \table_row3{ <b>`Container(id).OnPrevious`</b>,
4264 /// \anchor Container_OnPrevious
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).
4271 /// \table_row3{ <b>`Container(id).OnScrollPrevious`</b>,
4272 /// \anchor Container_OnScrollPrevious
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.
4279 /// \table_row3{ <b>`Container(id).NumPages`</b>,
4280 /// \anchor Container_NumPages
4282 /// @return The number of pages in the container with given id. If no id is specified it
4283 /// grabs the current container.
4286 /// \table_row3{ <b>`Container(id).NumItems`</b>,
4287 /// \anchor Container_NumItems
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.
4293 /// \table_row3{ <b>`Container(id).NumAllItems`</b>,
4294 /// \anchor Container_NumAllItems
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.
4299 /// @skinning_v18 **[New Infolabel]** \link Container_NumAllItems `Container(id).NumAllItems`\endlink
4302 /// \table_row3{ <b>`Container(id).NumNonFolderItems`</b>,
4303 /// \anchor Container_NumNonFolderItems
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.
4309 /// @skinning_v18 **[New Infolabel]** \link Container_NumNonFolderItems `Container(id).NumNonFolderItems`\endlink
4312 /// \table_row3{ <b>`Container(id).CurrentPage`</b>,
4313 /// \anchor Container_CurrentPage
4315 /// @return THe current page in the container with given id.
4316 /// @note If no id is specified it grabs the current container.
4319 /// \table_row3{ <b>`Container(id).CurrentItem`</b>,
4320 /// \anchor Container_CurrentItem
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.
4325 /// @skinning_v15 **[New Infolabel]** \link Container_CurrentItem `Container(id).CurrentItem`\endlink
4328 /// \table_row3{ <b>`Container(id).Scrolling`</b>,
4329 /// \anchor Container_Scrolling
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.
4339 /// \table_row3{ <b>`Container(id).HasNext`</b>,
4340 /// \anchor Container_HasNext
4342 /// @return **True** if the container or textbox with id (id) has a next page.
4345 /// \table_row3{ <b>`Container(id).HasParent`</b>,
4346 /// \anchor Container_HasParent
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.
4351 /// @skinning_v16 **[New Boolean Condition]** \link Container_HasParent `Container.HasParent`\endlink
4354 /// \table_row3{ <b>`Container(id).HasPrevious`</b>,
4355 /// \anchor Container_HasPrevious
4357 /// @return **True** if the container or textbox with id (id) has a previous page.
4360 /// \table_row3{ <b>`Container(id).IsUpdating`</b>,
4361 /// \anchor Container_IsUpdating
4363 /// @return **True** if the container with dynamic list content is currently updating.
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
4385 /// @return The row number of the focused position in a panel container.
4387 /// @skinning_v16 **[New Infolabel]** \link Container_Row `Container(id).Row`\endlink
4390 /// \table_row3{ <b>`Container(id).Row(parameter)`</b>,
4391 /// \anchor Container_Row_parameter
4393 /// @return **True** if the row number of the focused position matches the specified parameter.
4396 /// \table_row3{ <b>`Container(id).Column`</b>,
4397 /// \anchor Container_Column
4399 /// @return The column number of the focused position in a panel container.
4401 /// @skinning_v16 **[New Infolabel]** \link Container_Column `Container(id).Column`\endlink
4404 /// \table_row3{ <b>`Container(id).Column(parameter)`</b>,
4405 /// \anchor Container_Column_parameter
4407 /// @return **True** if the column number of the focused position matches the specified parameter.
4410 /// \table_row3{ <b>`Container(id).Position`</b>,
4411 /// \anchor Container_Position
4413 /// @return The current focused position of container / grouplist (id) as a
4416 /// @skinning_v16 **[Infolabel Updated]** \link Container_Position `Container(id).Position`\endlink
4417 /// now also returns the position for items inside a grouplist.
4420 /// \table_row3{ <b>`Container(id).Position(parameter)`</b>,
4421 /// \anchor Container_Position_parameter
4423 /// @return **True** if the container with id (or current container if id is omitted) is focused on the specified position.
4426 /// \table_row3{ <b>`Container(id).SubItem(item_number)`</b>,
4427 /// \anchor Container_SubItem
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.
4433 /// \table_row3{ <b>`Container(id).HasFocus(item_number)`</b>,
4434 /// \anchor Container_HasFocus
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
4441 /// \table_row3{ <b>`Container.SortMethod`</b>,
4442 /// \anchor Container_SortMethod
4444 /// @return The current sort method (returns a localized value).
4447 /// \table_row3{ <b>`Container.SortMethod(sortid)`</b>,
4448 /// \anchor Container_SortMethod_sortid
4450 /// @return **True** if the current sort method matches the specified SortID (see \ref List_of_sort_methods "SortUtils").
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
4465 /// @return The current add-on category.
4468 /// \table_row3{ <b>`Container.Property(reponame)`</b>,
4469 /// \anchor Container_Property_reponame
4471 /// @return The current add-on repository name.
4474 /// \table_row3{ <b>`Container.Content`</b>,
4475 /// \anchor Container_Content
4477 /// @return The content of the current container.
4479 /// @skinning_v16 **[New Infolabel]** \link Container_Content `Container.Content`\endlink
4482 /// \table_row3{ <b>`Container(id).ListItem(offset).Property`</b>,
4483 /// \anchor Container_ListItem_property
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 `
4491 /// \table_row3{ <b>`Container(id).ListItemNoWrap(offset).Property`</b>,
4492 /// \anchor Container_ListItemNoWrap
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`
4503 /// \table_row3{ <b>`Container(id).ListItemPosition(x).[infolabel]`</b>,
4504 /// \anchor Container_ListItemPosition
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`
4511 /// \table_row3{ <b>`Container(id).ListItemAbsolute(x).[infolabel]`</b>,
4512 /// \anchor Container_ListItemAbsolute
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`
4518 /// @skinning_v16 **[New Infolabel]** \link Container_ListItemAbsolute `Container(id).ListItemAbsolute(x).[infolabel]`\endlink
4521 /// \table_row3{ <b>`Container.Content(parameter)`</b>,
4522 /// \anchor Container_Content_parameter
4524 /// @return **True** if the current container you are in contains the following:
4527 /// - <b>artists</b>
4530 /// - <b>tvshows</b>
4531 /// - <b>seasons</b>
4532 /// - <b>episodes</b>
4533 /// - <b>musicvideos</b>
4537 /// - <b>playlists</b>
4538 /// - <b>plugins</b>
4539 /// - <b>studios</b>
4540 /// - <b>directors</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
4549 /// \table_row3{ <b>`Container.Art(type)`</b>,
4550 /// \anchor Container_Art
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
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
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
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>
4578 /// -----------------------------------------------------------------------------
4580 /// \page modules__infolabels_boolean_conditions
4581 /// \subsection modules__infolabels_boolean_conditions_ListItem ListItem
4583 /// \table_h3{ Labels, Type, Description }
4584 /// \table_row3{ <b>`ListItem.Thumb`</b>,
4585 /// \anchor ListItem_Thumb
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)"
4593 /// \table_row3{ <b>`ListItem.Icon`</b>,
4594 /// \anchor ListItem_Icon
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.
4600 /// \table_row3{ <b>`ListItem.ActualIcon`</b>,
4601 /// \anchor ListItem_ActualIcon
4603 /// @return The icon of the currently selected item in a list or thumb control.
4606 /// \table_row3{ <b>`ListItem.Overlay`</b>,
4607 /// \anchor ListItem_Overlay
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
4616 /// \table_row3{ <b>`ListItem.IsFolder`</b>,
4617 /// \anchor ListItem_IsFolder
4619 /// @return **True** if the current ListItem is a folder.
4622 /// \table_row3{ <b>`ListItem.IsPlaying`</b>,
4623 /// \anchor ListItem_IsPlaying
4625 /// @return **True** if the current ListItem.* info labels and images are
4626 /// currently Playing media.
4629 /// \table_row3{ <b>`ListItem.IsResumable`</b>,
4630 /// \anchor ListItem_IsResumable
4632 /// @return **True** when the current ListItem has been partially played.
4635 /// \table_row3{ <b>`ListItem.IsCollection`</b>,
4636 /// \anchor ListItem_IsCollection
4638 /// @return **True** when the current ListItem is a movie set.
4640 /// @skinning_v15 **[New Boolean Condition]** \link ListItem_IsCollection `ListItem.IsCollection`\endlink
4643 /// \table_row3{ <b>`ListItem.IsSelected`</b>,
4644 /// \anchor ListItem_IsSelected
4646 /// @return **True** if the current ListItem is selected (f.e. currently playing
4647 /// in playlist window).
4650 /// \table_row3{ <b>`ListItem.HasEpg`</b>,
4651 /// \anchor ListItem_HasEpg
4653 /// @return **True** when the selected programme has epg info (PVR).
4656 /// \table_row3{ <b>`ListItem.HasTimer`</b>,
4657 /// \anchor ListItem_HasTimer
4659 /// @return **True** when a recording timer has been set for the selected
4660 /// programme (PVR).
4663 /// \table_row3{ <b>`ListItem.IsRecording`</b>,
4664 /// \anchor ListItem_IsRecording
4666 /// @return **True** when the selected programme is being recorded (PVR).
4669 /// \table_row3{ <b>`ListItem.IsPlayable`</b>,
4670 /// \anchor ListItem_IsPlayable
4672 /// @return **True** when the selected programme can be played (PVR)
4674 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_IsPlayable `ListItem.IsPlayable`\endlink
4677 /// \table_row3{ <b>`ListItem.HasArchive`</b>,
4678 /// \anchor ListItem_HasArchive
4680 /// @return **True** when the selected channel has a server-side back buffer (PVR)
4682 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_HasArchive `ListItem.HasArchive`\endlink
4685 /// \table_row3{ <b>`ListItem.IsEncrypted`</b>,
4686 /// \anchor ListItem_IsEncrypted
4688 /// @return **True** when the selected programme is encrypted (PVR).
4691 /// \table_row3{ <b>`ListItem.IsStereoscopic`</b>,
4692 /// \anchor ListItem_IsStereoscopic
4694 /// @return **True** when the selected video is a 3D (stereoscopic) video.
4696 /// @skinning_v13 **[New Boolean Condition]** \link ListItem_IsStereoscopic `ListItem.IsStereoscopic`\endlink
4699 /// \table_row3{ <b>`ListItem.Property(IsSpecial)`</b>,
4700 /// \anchor ListItem_Property_IsSpecial
4702 /// @return **True** if the current Season/Episode is a Special.
4705 /// \table_row3{ <b>`ListItem.Property(DateLabel)`</b>,
4706 /// \anchor ListItem_Property_DateLabel
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.
4712 /// \table_row3{ <b>`ListItem.Property(Addon.IsEnabled)`</b>,
4713 /// \anchor ListItem_Property_AddonIsEnabled
4715 /// @return **True** when the selected addon is enabled (for use in the addon
4716 /// info dialog only).
4718 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsEnabled `ListItem.Property(Addon.IsEnabled)`\endlink
4719 /// replaces `ListItem.Property(Addon.Enabled)`.
4722 /// \table_row3{ <b>`ListItem.Property(Addon.IsInstalled)`</b>,
4723 /// \anchor ListItem_Property_AddonIsInstalled
4725 /// @return **True** when the selected addon is installed (for use in the addon
4726 /// info dialog only).
4728 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsInstalled `ListItem.Property(Addon.IsInstalled)`\endlink
4729 /// replaces `ListItem.Property(Addon.Installed)`.
4732 /// \table_row3{ <b>`ListItem.Property(Addon.HasUpdate)`</b>,
4733 /// \anchor ListItem_Property_AddonHasUpdate
4735 /// @return **True** when there's an update available for the selected addon.
4737 /// @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonHasUpdate `ListItem.Property(Addon.HasUpdate)`\endlink
4738 /// replaces `ListItem.Property(Addon.UpdateAvail)`.
4741 /// \table_row3{ <b>`ListItem.IsAutoUpdateable`</b>,
4742 /// \anchor ListItem_IsAutoUpdateable
4744 /// @return **True** if this add-on can be updated automatically.
4746 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_IsAutoUpdateable `ListItem.IsAutoUpdateable`\endlink
4749 /// \table_row3{ <b>`ListItem.Property(Addon.IsFromOfficialRepo)`</b>,
4750 /// \anchor ListItem_Property_AddonIsFromOfficialRepo
4752 /// @return **True** if this add-on is from an official repository.
4754 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsFromOfficialRepo `ListItem.Property(Addon.IsFromOfficialRepo)`\endlink
4757 /// \table_row3{ <b>`ListItem.Property(Addon.IsBinary)`</b>,
4758 /// \anchor ListItem_Property_AddonIsBinary
4760 /// @return **True** if this add-on is a binary addon.
4762 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsBinary `ListItem.Property(Addon.IsBinary)`\endlink
4765 /// \table_row3{ <b>`ListItem.Property(Addon.IsUpdate)`</b>,
4766 /// \anchor ListItem_Property_AddonIsUpdate
4768 /// @return **True** if this add-on is a valid update of an installed outdated add-on.
4770 /// @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsUpdate `ListItem.Property(Addon.IsUpdate)`\endlink
4773 /// \table_row3{ <b>`ListItem.Property(Addon.ValidUpdateOrigin)`</b>,
4774 /// \anchor ListItem_Property_ValidUpdateOrigin
4776 /// @return The origin string of a valid update for the addon. Empty string if there is no valid update available.
4778 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateOrigin `ListItem.Property(Addon.ValidUpdateOrigin)`\endlink
4781 /// \table_row3{ <b>`ListItem.Property(Addon.ValidUpdateVersion)`</b>,
4782 /// \anchor ListItem_Property_ValidUpdateVersion
4784 /// @return The version string of a valid update for the addon. Empty string if there is no valid update available.
4786 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateVersion `ListItem.Property(Addon.ValidUpdateVersion)`\endlink
4789 /// \table_row3{ <b>`ListItem.Label`</b>,
4790 /// \anchor ListItem_Label
4792 /// @return The left label of the currently selected item in a container.
4795 /// \table_row3{ <b>`ListItem.Label2`</b>,
4796 /// \anchor ListItem_Label2
4798 /// @return The right label of the currently selected item in a container.
4801 /// \table_row3{ <b>`ListItem.Title`</b>,
4802 /// \anchor ListItem_Title
4804 /// @return The title of the currently selected song\, movie\, game in a container.
4806 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
4807 /// to support games
4810 /// \table_row3{ <b>`ListItem.OriginalTitle`</b>,
4811 /// \anchor ListItem_OriginalTitle
4813 /// @return The original title of the currently selected movie in a container.
4816 /// \table_row3{ <b>`ListItem.SortLetter`</b>,
4817 /// \anchor ListItem_SortLetter
4819 /// @return The first letter of the current file in a container.
4822 /// \table_row3{ <b>`ListItem.TrackNumber`</b>,
4823 /// \anchor ListItem_TrackNumber
4825 /// @return The track number of the currently selected song in a container.
4828 /// \table_row3{ <b>`ListItem.Artist`</b>,
4829 /// \anchor ListItem_Artist
4831 /// @return The artist of the currently selected song in a container.
4834 /// \table_row3{ <b>`ListItem.AlbumArtist`</b>,
4835 /// \anchor ListItem_AlbumArtist
4837 /// @return The artist of the currently selected album in a list.
4840 /// \table_row3{ <b>`ListItem.Property(Artist_Sortname)`</b>,
4841 /// \anchor ListItem_Property_Artist_Sortname
4843 /// @return The sortname of the currently selected Artist.
4845 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Sortname `ListItem.Property(Artist_Sortname)`\endlink
4848 /// \table_row3{ <b>`ListItem.Property(Artist_Type)`</b>,
4849 /// \anchor ListItem_Property_Artist_Type
4851 /// @return The type of the currently selected Artist - person\, group\, orchestra\, choir etc.
4853 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Type `ListItem.Property(Artist_Type)`\endlink
4856 /// \table_row3{ <b>`ListItem.Property(Artist_Gender)`</b>,
4857 /// \anchor ListItem_Property_Artist_Gender
4859 /// @return The Gender of the currently selected Artist - male\, female\, other.
4861 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Gender `ListItem.Property(Artist_Gender)`\endlink
4864 /// \table_row3{ <b>`ListItem.Property(Artist_Disambiguation)`</b>,
4865 /// \anchor ListItem_Property_Artist_Disambiguation
4867 /// @return A Brief description of the currently selected Artist that differentiates them
4868 /// from others with the same name.
4870 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Disambiguation `ListItem.Property(Artist_Disambiguation)`\endlink
4873 /// \table_row3{ <b>`ListItem.Property(Artist_Born)`</b>,
4874 /// \anchor ListItem_Property_Artist_Born
4876 /// @return The date of Birth of the currently selected Artist.
4879 /// \table_row3{ <b>`ListItem.Property(Artist_Died)`</b>,
4880 /// \anchor ListItem_Property_Artist_Died
4882 /// @return The date of Death of the currently selected Artist.
4885 /// \table_row3{ <b>`ListItem.Property(Artist_Formed)`</b>,
4886 /// \anchor ListItem_Property_Artist_Formed
4888 /// @return The formation date of the currently selected Band.
4891 /// \table_row3{ <b>`ListItem.Property(Artist_Disbanded)`</b>,
4892 /// \anchor ListItem_Property_Artist_Disbanded
4894 /// @return The disbanding date of the currently selected Band.
4897 /// \table_row3{ <b>`ListItem.Property(Artist_YearsActive)`</b>,
4898 /// \anchor ListItem_Property_Artist_YearsActive
4900 /// @return The years the currently selected artist has been active.
4903 /// \table_row3{ <b>`ListItem.Property(Artist_Instrument)`</b>,
4904 /// \anchor ListItem_Property_Artist_Instrument
4906 /// @return The instruments played by the currently selected artist.
4909 /// \table_row3{ <b>`ListItem.Property(Artist_Description)`</b>,
4910 /// \anchor ListItem_Property_Artist_Description
4912 /// @return A biography of the currently selected artist.
4915 /// \table_row3{ <b>`ListItem.Property(Artist_Mood)`</b>,
4916 /// \anchor ListItem_Property_Artist_Mood
4918 /// @return The moods of the currently selected artist.
4921 /// \table_row3{ <b>`ListItem.Property(Artist_Style)`</b>,
4922 /// \anchor ListItem_Property_Artist_Style
4924 /// @return The styles of the currently selected artist.
4927 /// \table_row3{ <b>`ListItem.Property(Artist_Genre)`</b>,
4928 /// \anchor ListItem_Property_Artist_Genre
4930 /// @return The genre of the currently selected artist.
4933 /// \table_row3{ <b>`ListItem.Album`</b>,
4934 /// \anchor ListItem_Album
4936 /// @return The album of the currently selected song in a container.
4939 /// \table_row3{ <b>`ListItem.Property(Album_Mood)`</b>,
4940 /// \anchor ListItem_Property_Album_Mood
4942 /// @return The moods of the currently selected Album.
4945 /// \table_row3{ <b>`ListItem.Property(Album_Style)`</b>,
4946 /// \anchor ListItem_Property_Album_Style
4948 /// @return The styles of the currently selected Album.
4951 /// \table_row3{ <b>`ListItem.Property(Album_Theme)`</b>,
4952 /// \anchor ListItem_Property_Album_Theme
4954 /// @return The themes of the currently selected Album.
4957 /// \table_row3{ <b>`ListItem.Property(Album_Type)`</b>,
4958 /// \anchor ListItem_Property_Album_Type
4960 /// @return The Album Type (e.g. compilation\, enhanced\, explicit lyrics) of
4961 /// the currently selected Album.
4964 /// \table_row3{ <b>`ListItem.Property(Album_Label)`</b>,
4965 /// \anchor ListItem_Property_Album_Label
4967 /// @return The record label of the currently selected Album.
4970 /// \table_row3{ <b>`ListItem.Property(Album_Description)`</b>,
4971 /// \anchor ListItem_Property_Album_Description
4973 /// @return A review of the currently selected Album.
4976 /// \table_row3{ <b>`ListItem.Property(Album_Totaldiscs)`</b>,
4977 /// \anchor ListItem_Property_Album_Totaldiscs
4979 /// @return The total number of discs belonging to an album.
4981 /// @skinning_v19 **[New Infolabel]** \link ListItem.Property(Album_Totaldiscs) `ListItem.Property(Album_Totaldiscs)`\endlink
4984 /// \table_row3{ <b>`ListItem.Property(Album_Isboxset)`</b>,
4985 /// \anchor ListItem_Property_Album_Isboxset
4987 /// @return **True** if the album is a boxset.
4989 /// @skinning_v19 **[New Infobool]** \link ListItem.Property(Album_Isboxset) `ListItem.Property(Album_Isboxset)`\endlink
4992 /// \table_row3{ <b>`ListItem.Property(Album_Duration)`</b>,
4993 /// \anchor ListItem_Property_Album_Duration
4995 /// @return The duration of the album in HH:MM:SS.
4997 /// @skinning_v19 **[New Infolabel]** \link ListItem_Property_Album_Duration `ListItem.Property(Album_Duration)`\endlink
5000 /// \table_row3{ <b>`ListItem.DiscNumber`</b>,
5001 /// \anchor ListItem_DiscNumber
5003 /// @return The disc number of the currently selected song in a container.
5006 /// \table_row3{ <b>`ListItem.Year`</b>,
5007 /// \anchor ListItem_Year
5009 /// @return The year of the currently selected song\, album\, movie\, game in a
5012 /// @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
5013 /// to support games
5016 /// \table_row3{ <b>`ListItem.Premiered`</b>,
5017 /// \anchor ListItem_Premiered
5019 /// @return The release/aired date of the currently selected episode\, show\,
5020 /// movie or EPG item in a container.
5022 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Premiered `ListItem.Premiered`\endlink
5023 /// now also available for EPG items.
5026 /// \table_row3{ <b>`ListItem.Genre`</b>,
5027 /// \anchor ListItem_Genre
5029 /// @return The genre of the currently selected song\, album or movie in a
5033 /// \table_row3{ <b>`ListItem.Contributors`</b>,
5034 /// \anchor ListItem_Contributors
5036 /// @return The list of all people who've contributed to the selected song.
5038 /// @skinning_v17 **[New Infolabel]** \link ListItem_Contributors `ListItem.Contributors`\endlink
5041 /// \table_row3{ <b>`ListItem.ContributorAndRole`</b>,
5042 /// \anchor ListItem_ContributorAndRole
5044 /// @return The list of all people and their role who've contributed to the selected song.
5046 /// @skinning_v17 **[New Infolabel]** \link ListItem_ContributorAndRole `ListItem.ContributorAndRole`\endlink
5049 /// \table_row3{ <b>`ListItem.Director`</b>,
5050 /// \anchor ListItem_Director
5052 /// @return The director of the currently selected movie in a container.
5054 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Director `ListItem.Director`\endlink
5055 /// also supports EPG.
5058 /// \table_row3{ <b>`ListItem.Country`</b>,
5059 /// \anchor ListItem_Country
5061 /// @return The production country of the currently selected movie in a
5065 /// \table_row3{ <b>`ListItem.Episode`</b>,
5066 /// \anchor ListItem_Episode
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
5073 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Episode `ListItem.Episode`\endlink
5074 /// also supports EPG.
5077 /// \table_row3{ <b>`ListItem.Season`</b>,
5078 /// \anchor ListItem_Season
5080 /// @return The season value for the currently selected tvshow.
5082 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Season `ListItem.Season`\endlink
5083 /// also supports EPG.
5086 /// \table_row3{ <b>`ListItem.TVShowTitle`</b>,
5087 /// \anchor ListItem_TVShowTitle
5089 /// @return The name value for the currently selected tvshow in the season and
5090 /// episode depth of the video library.
5093 /// \table_row3{ <b>`ListItem.Property(TotalSeasons)`</b>,
5094 /// \anchor ListItem_Property_TotalSeasons
5096 /// @return The total number of seasons for the currently selected tvshow.
5099 /// \table_row3{ <b>`ListItem.Property(TotalEpisodes)`</b>,
5100 /// \anchor ListItem_Property_TotalEpisodes
5102 /// @return the total number of episodes for the currently selected tvshow or
5106 /// \table_row3{ <b>`ListItem.Property(WatchedEpisodes)`</b>,
5107 /// \anchor ListItem_Property_WatchedEpisodes
5109 /// @return The number of watched episodes for the currently selected tvshow
5113 /// \table_row3{ <b>`ListItem.Property(UnWatchedEpisodes)`</b>,
5114 /// \anchor ListItem_Property_UnWatchedEpisodes
5116 /// @return The number of unwatched episodes for the currently selected tvshow
5120 /// \table_row3{ <b>`ListItem.Property(NumEpisodes)`</b>,
5121 /// \anchor ListItem_Property_NumEpisodes
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.
5127 /// \table_row3{ <b>`ListItem.Property(WatchedEpisodePercent)`</b>,
5128 /// \anchor ListItem_Property_WatchedEpisodePercent
5130 /// @return The percentage of watched episodes in the tvshow (watched/total*100) or season.
5132 /// @skinning_v20 **[New Infolabel]** \link ListItem_Property_WatchedEpisodePercent `ListItem.Property(WatchedEpisodePercent)`\endlink
5135 /// \table_row3{ <b>`ListItem.PictureAperture`</b>,
5136 /// \anchor ListItem_PictureAperture
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).
5142 /// \table_row3{ <b>`ListItem.PictureAuthor`</b>,
5143 /// \anchor ListItem_PictureAuthor
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).
5148 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureAuthor `ListItem.PictureAuthor`\endlink
5151 /// \table_row3{ <b>`ListItem.PictureByline`</b>,
5152 /// \anchor ListItem_PictureByline
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).
5157 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureByline `ListItem.PictureByline`\endlink
5160 /// \table_row3{ <b>`ListItem.PictureBylineTitle`</b>,
5161 /// \anchor ListItem_PictureBylineTitle
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).
5166 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureBylineTitle `ListItem.PictureBylineTitle`\endlink
5169 /// \table_row3{ <b>`ListItem.PictureCamMake`</b>,
5170 /// \anchor ListItem_PictureCamMake
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).
5176 /// \table_row3{ <b>`ListItem.PictureCamModel`</b>,
5177 /// \anchor ListItem_PictureCamModel
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).
5184 /// \table_row3{ <b>`ListItem.PictureCaption`</b>,
5185 /// \anchor ListItem_PictureCaption
5187 /// @return A description of the selected picture.
5188 /// @note This is the value of the IPTC Caption tag (hex code 0x78).
5191 /// \table_row3{ <b>`ListItem.PictureCategory`</b>,
5192 /// \anchor ListItem_PictureCategory
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).
5197 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCategory `ListItem.PictureCategory`\endlink
5200 /// \table_row3{ <b>`ListItem.PictureCCDWidth`</b>,
5201 /// \anchor ListItem_PictureCCDWidth
5203 /// @return The width of the CCD in the camera used to take the selected
5205 /// @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
5207 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCCDWidth `ListItem.PictureCCDWidth`\endlink
5210 /// \table_row3{ <b>`ListItem.PictureCity`</b>,
5211 /// \anchor ListItem_PictureCity
5213 /// @return The city where the selected picture was taken.
5214 /// @note This is the value of the IPTC City tag (hex code 0x5A).
5216 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCity `ListItem.PictureCity`\endlink
5219 /// \table_row3{ <b>`ListItem.PictureColour`</b>,
5220 /// \anchor ListItem_PictureColour
5222 /// @return Whether the selected picture is "Colour" or "Black and White".
5224 /// @deprecated \link ListItem_PictureColour `ListItem.PictureColour`\endlink is deprecated and will be removed in future Kodi versions
5226 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureColour `ListItem.PictureColour`\endlink
5229 /// \table_row3{ <b>`ListItem.PictureComment`</b>,
5230 /// \anchor ListItem_PictureComment
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".
5238 /// \table_row3{ <b>`ListItem.PictureCopyrightNotice`</b>,
5239 /// \anchor ListItem_PictureCopyrightNotice
5241 /// @return The copyright notice of the selected picture.
5242 /// @note This is the value of the IPTC Copyright tag (hex code 0x74).
5244 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCopyrightNotice `ListItem.PictureCopyrightNotice`\endlink
5247 /// \table_row3{ <b>`ListItem.PictureCountry`</b>,
5248 /// \anchor ListItem_PictureCountry
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).
5253 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountry `ListItem.PictureCountry`\endlink
5256 /// \table_row3{ <b>`ListItem.PictureCountryCode`</b>,
5257 /// \anchor ListItem_PictureCountryCode
5259 /// @return The country code of the country where the selected picture was
5261 /// @note This is the value of the IPTC CountryCode tag (hex code 0x64).
5263 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountryCode `ListItem.PictureCountryCode`\endlink
5266 /// \table_row3{ <b>`ListItem.PictureCredit`</b>,
5267 /// \anchor ListItem_PictureCredit
5269 /// @return Who provided the selected picture.
5270 /// @note This is the value of the IPTC Credit tag (hex code 0x6E).
5272 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureCredit `ListItem.PictureCredit`\endlink
5275 /// \table_row3{ <b>`ListItem.PictureDate`</b>,
5276 /// \anchor ListItem_PictureDate
5278 /// @return The localized date of the selected picture. The short form of the
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
5285 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDate `ListItem.PictureDate`\endlink
5288 /// \table_row3{ <b>`ListItem.PictureDatetime`</b>,
5289 /// \anchor ListItem_PictureDatetime
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.
5297 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDatetime `ListItem.PictureDatetime`\endlink
5300 /// \table_row3{ <b>`ListItem.PictureDesc`</b>,
5301 /// \anchor ListItem_PictureDesc
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).
5308 /// \table_row3{ <b>`ListItem.PictureDigitalZoom`</b>,
5309 /// \anchor ListItem_PictureDigitalZoom
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).
5314 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureDigitalZoom `ListItem.PictureDigitalZoom`\endlink
5317 /// \table_row3{ <b>`ListItem.PictureExpMode`</b>,
5318 /// \anchor ListItem_PictureExpMode
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).
5328 /// \table_row3{ <b>`ListItem.PictureExposure`</b>,
5329 /// \anchor ListItem_PictureExposure
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>
5338 /// @note This is the value of the EXIF ExposureProgram tag (hex code 0x8822).
5340 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposure `ListItem.PictureExposure`\endlink
5343 /// \table_row3{ <b>`ListItem.PictureExposureBias`</b>,
5344 /// \anchor ListItem_PictureExposureBias
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).
5350 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposureBias `ListItem.PictureExposureBias`\endlink
5353 /// \table_row3{ <b>`ListItem.PictureExpTime`</b>,
5354 /// \anchor ListItem_PictureExpTime
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)
5362 /// \table_row3{ <b>`ListItem.PictureFlashUsed`</b>,
5363 /// \anchor ListItem_PictureFlashUsed
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).
5369 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureFlashUsed `ListItem.PictureFlashUsed`\endlink
5372 /// \table_row3{ <b>`ListItem.PictureFocalLen`</b>,
5373 /// \anchor ListItem_PictureFocalLen
5375 /// @return The lens focal length of the selected picture.
5378 /// \table_row3{ <b>`ListItem.PictureFocusDist`</b>,
5379 /// \anchor ListItem_PictureFocusDist
5381 /// @return The focal length of the lens\, in mm.
5382 /// @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
5384 /// \table_row3{ <b>`ListItem.PictureGPSLat`</b>,
5385 /// \anchor ListItem_PictureGPSLat
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.
5392 /// \table_row3{ <b>`ListItem.PictureGPSLon`</b>,
5393 /// \anchor ListItem_PictureGPSLon
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.
5400 /// \table_row3{ <b>`ListItem.PictureGPSAlt`</b>,
5401 /// \anchor ListItem_PictureGPSAlt
5403 /// @return The altitude in meters where the selected picture was taken.
5404 /// @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
5407 /// \table_row3{ <b>`ListItem.PictureHeadline`</b>,
5408 /// \anchor ListItem_PictureHeadline
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).
5413 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureHeadline `ListItem.PictureHeadline`\endlink
5416 /// \table_row3{ <b>`ListItem.PictureImageType`</b>,
5417 /// \anchor ListItem_PictureImageType
5419 /// @return The color components of the selected picture.
5420 /// @note This is the value of the IPTC ImageType tag (hex code 0x82).
5422 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureImageType `ListItem.PictureImageType`\endlink
5425 /// \table_row3{ <b>`ListItem.PictureIPTCDate`</b>,
5426 /// \anchor ListItem_PictureIPTCDate
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).
5432 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCDate `ListItem.PictureIPTCDate`\endlink
5435 /// \table_row3{ <b>`ListItem.PictureIPTCTime`</b>,
5436 /// \anchor ListItem_PictureIPTCTime
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).
5442 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCTime `ListItem.PictureIPTCTime`\endlink
5445 /// \table_row3{ <b>`ListItem.PictureISO`</b>,
5446 /// \anchor ListItem_PictureISO
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).
5452 /// \table_row3{ <b>`ListItem.PictureKeywords`</b>,
5453 /// \anchor ListItem_PictureKeywords
5455 /// @return The keywords assigned to the selected picture.
5456 /// @note This is the value of the IPTC Keywords tag (hex code 0x19).
5459 /// \table_row3{ <b>`ListItem.PictureLightSource`</b>,
5460 /// \anchor ListItem_PictureLightSource
5462 /// @return The kind of light source when the picture was taken. Possible
5464 /// - <b>"Daylight"</b>
5465 /// - <b>"Fluorescent"</b>
5466 /// - <b>"Incandescent"</b>
5468 /// @note This is the value of the EXIF LightSource tag (hex code 0x9208).
5470 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureLightSource `ListItem.PictureLightSource`\endlink
5473 /// \table_row3{ <b>`ListItem.PictureLongDate`</b>,
5474 /// \anchor ListItem_PictureLongDate
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.
5483 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureLongDate `ListItem.PictureLongDate`\endlink
5486 /// \table_row3{ <b>`ListItem.PictureLongDatetime`</b>,
5487 /// \anchor ListItem_PictureLongDatetime
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.
5497 /// \table_row3{ <b>`ListItem.PictureMeteringMode`</b>,
5498 /// \anchor ListItem_PictureMeteringMode
5500 /// @return The metering mode used when the selected picture was taken. The
5501 /// possible values are:
5502 /// - <b>"Center weight"</b>
5504 /// - <b>"Matrix"</b>
5505 /// @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
5507 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureMeteringMode `ListItem.PictureMeteringMode`\endlink
5510 /// \table_row3{ <b>`ListItem.PictureObjectName`</b>,
5511 /// \anchor ListItem_PictureObjectName
5513 /// @return A shorthand reference for the selected picture.
5514 /// @note This is the value of the IPTC ObjectName tag (hex code 0x05).
5516 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureObjectName `ListItem.PictureObjectName`\endlink
5519 /// \table_row3{ <b>`ListItem.PictureOrientation`</b>,
5520 /// \anchor ListItem_PictureOrientation
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>
5528 /// @note This is the value of the EXIF Orientation tag (hex code 0x0112).
5530 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureOrientation `ListItem.PictureOrientation`\endlink
5533 /// \table_row3{ <b>`ListItem.PicturePath`</b>,
5534 /// \anchor ListItem_PicturePath
5536 /// @return The filename and path of the selected picture.
5539 /// \table_row3{ <b>`ListItem.PictureProcess`</b>,
5540 /// \anchor ListItem_PictureProcess
5542 /// @return The process used to compress the selected picture.
5544 /// @deprecated \link ListItem_PictureProcess `ListItem.PictureProcess`\endlink is deprecated and will be removed in future Kodi versions
5546 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureProcess `ListItem.PictureProcess`\endlink
5549 /// \table_row3{ <b>`ListItem.PictureReferenceService`</b>,
5550 /// \anchor ListItem_PictureReferenceService
5552 /// @return The Service Identifier of a prior envelope to which the selected
5554 /// @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
5556 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureReferenceService `ListItem.PictureReferenceService`\endlink
5559 /// \table_row3{ <b>`ListItem.PictureResolution`</b>,
5560 /// \anchor ListItem_PictureResolution
5562 /// @return The dimensions of the selected picture.
5565 /// \table_row3{ <b>`ListItem.PictureSource`</b>,
5566 /// \anchor ListItem_PictureSource
5568 /// @return The original owner of the selected picture.
5569 /// @note This is the value of the IPTC Source tag (hex code 0x73).
5571 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSource `ListItem.PictureSource`\endlink
5574 /// \table_row3{ <b>`ListItem.PictureSpecialInstructions`</b>,
5575 /// \anchor ListItem_PictureSpecialInstructions
5577 /// @return Other editorial instructions concerning the use of the selected
5579 /// @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
5581 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSpecialInstructions `ListItem.PictureSpecialInstructions`\endlink
5584 /// \table_row3{ <b>`ListItem.PictureState`</b>,
5585 /// \anchor ListItem_PictureState
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).
5590 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureState `ListItem.PictureState`\endlink
5593 /// \table_row3{ <b>`ListItem.PictureSublocation`</b>,
5594 /// \anchor ListItem_PictureSublocation
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).
5600 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSublocation `ListItem.PictureSublocation`\endlink
5603 /// \table_row3{ <b>`ListItem.PictureSupplementalCategories`</b>,
5604 /// \anchor ListItem_PictureSupplementalCategories
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).
5610 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureSupplementalCategories `ListItem.PictureSupplementalCategories`\endlink
5613 /// \table_row3{ <b>`ListItem.PictureTransmissionReference`</b>,
5614 /// \anchor ListItem_PictureTransmissionReference
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).
5620 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureTransmissionReference `ListItem.PictureTransmissionReference`\endlink
5623 /// \table_row3{ <b>`ListItem.PictureUrgency`</b>,
5624 /// \anchor ListItem_PictureUrgency
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).
5632 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureUrgency `ListItem.PictureUrgency`\endlink
5635 /// \table_row3{ <b>`ListItem.PictureWhiteBalance`</b>,
5636 /// \anchor ListItem_PictureWhiteBalance
5638 /// @return The white balance mode set when the selected picture was taken.
5639 /// The possible values are:
5640 /// - <b>"Manual"</b>
5642 /// @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
5644 /// @skinning_v13 **[New Infolabel]** \link ListItem_PictureWhiteBalance `ListItem.PictureWhiteBalance`\endlink
5647 /// \table_row3{ <b>`ListItem.FileName`</b>,
5648 /// \anchor ListItem_FileName
5650 /// @return The filename of the currently selected song or movie in a container.
5653 /// \table_row3{ <b>`ListItem.Path`</b>,
5654 /// \anchor ListItem_Path
5656 /// @return The complete path of the currently selected song or movie in a
5660 /// \table_row3{ <b>`ListItem.FolderName`</b>,
5661 /// \anchor ListItem_FolderName
5663 /// @return The top most folder of the path of the currently selected song or
5664 /// movie in a container.
5667 /// \table_row3{ <b>`ListItem.FolderPath`</b>,
5668 /// \anchor ListItem_FolderPath
5670 /// @return The complete path of the currently selected song or movie in a
5671 /// container (without user details).
5674 /// \table_row3{ <b>`ListItem.FileNameAndPath`</b>,
5675 /// \anchor ListItem_FileNameAndPath
5677 /// @return The full path with filename of the currently selected song or
5678 /// movie in a container.
5681 /// \table_row3{ <b>`ListItem.FileExtension`</b>,
5682 /// \anchor ListItem_FileExtension
5684 /// @return The file extension (without leading dot) of the currently selected
5685 /// item in a container.
5688 /// \table_row3{ <b>`ListItem.FileNameNoExtension`</b>,
5689 /// \anchor ListItem_FileName_No_Extension
5691 /// @return The filename without extension of the currently selected
5692 /// item in a container.
5694 /// @skinning_v19 **[New Infolabel]** \link ListItem_FileName_No_Extension `ListItem.FileNameNoExtension`\endlink
5697 /// \table_row3{ <b>`ListItem.Date`</b>,
5698 /// \anchor ListItem_Date
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).
5705 /// \table_row3{ <b>`ListItem.DateTime`</b>,
5706 /// \anchor ListItem_DateTime
5708 /// @return The date and time a certain event happened (event log).
5710 /// @skinning_v16 **[New Infolabel]** \link ListItem_DateTime `ListItem.DateTime`\endlink
5713 /// \table_row3{ <b>`ListItem.DateAdded`</b>,
5714 /// \anchor ListItem_DateAdded
5716 /// @return The date the currently selected item was added to the
5717 /// library / Date and time of an event in the EventLog window.
5720 /// \table_row3{ <b>`ListItem.Size`</b>,
5721 /// \anchor ListItem_Size
5723 /// @return The file size of the currently selected song or movie in a
5727 /// \table_row3{ <b>`ListItem.Rating([name])`</b>,
5728 /// \anchor ListItem_Rating
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.
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.
5741 /// \table_row3{ <b>`ListItem.Set`</b>,
5742 /// \anchor ListItem_Set
5744 /// @return The name of the set the movie is part of.
5746 /// @skinning_v17 **[New Infolabel]** \link ListItem_Set `ListItem.Set`\endlink
5749 /// \table_row3{ <b>`ListItem.SetId`</b>,
5750 /// \anchor ListItem_SetId
5752 /// @return The id of the set the movie is part of.
5754 /// @skinning_v17 **[New Infolabel]** \link ListItem_SetId `ListItem.SetId`\endlink
5757 /// \table_row3{ <b>`ListItem.Status`</b>,
5758 /// \anchor ListItem_Status
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>
5767 /// @note For use with tv shows.
5769 /// @skinning_v17 **[New Infolabel]** \link ListItem_Status `ListItem.Status`\endlink
5772 /// \table_row3{ <b>`ListItem.EndTimeResume`</b>,
5773 /// \anchor ListItem_EndTimeResume
5775 /// @return Returns the time a video will end if you resume it\, instead of playing it from the beginning.
5777 /// @skinning_v17 **[New Infolabel]** \link ListItem_EndTimeResume `ListItem.EndTimeResume`\endlink
5780 /// \table_row3{ <b>`ListItem.UserRating`</b>,
5781 /// \anchor ListItem_UserRating
5783 /// @return The user rating of the currently selected item in a container (1-10).
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
5790 /// \table_row3{ <b>`ListItem.Votes([name])`</b>,
5791 /// \anchor ListItem_Votes
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`.
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
5802 /// \table_row3{ <b>`ListItem.RatingAndVotes([name])`</b>,
5803 /// \anchor ListItem_RatingAndVotes
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`.
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.
5815 /// \table_row3{ <b>`ListItem.Mood`</b>,
5816 /// \anchor ListItem_Mood
5818 /// @return The mood of the selected song.
5820 /// @skinning_v17 **[New Infolabel]** \link ListItem_Mood `ListItem.Mood`\endlink
5823 /// \table_row3{ <b>`ListItem.Mpaa`</b>,
5824 /// \anchor ListItem_Mpaa
5826 /// @return The MPAA rating of the currently selected movie in a container.
5829 /// \table_row3{ <b>`ListItem.ProgramCount`</b>,
5830 /// \anchor ListItem_ProgramCount
5832 /// @return The number of times an xbe has been run from "my programs".
5833 /// @todo description might be outdated
5836 /// \table_row3{ <b>`ListItem.Duration`</b>,
5837 /// \anchor ListItem_Duration
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.
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.
5847 /// \table_row3{ <b>`ListItem.Duration(format)`</b>,
5848 /// \anchor ListItem_Duration_format
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.
5856 /// \table_row3{ <b>`ListItem.DBTYPE`</b>,
5857 /// \anchor ListItem_DBTYPE
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.
5866 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_DBTYPE `ListItem.DBTYPE`\endlink
5867 /// now available in the music library.
5870 /// \table_row3{ <b>`ListItem.DBID`</b>,
5871 /// \anchor ListItem_DBID
5873 /// @return The database id of the currently selected listitem in a container.
5876 /// \table_row3{ <b>`ListItem.Appearances`</b>,
5877 /// \anchor ListItem_Appearances
5879 /// @return The number of movies featuring the selected actor / directed by the selected director.
5881 /// @skinning_v17 **[New Infolabel]** \link ListItem_Appearances `ListItem.Appearances`\endlink
5884 /// \table_row3{ <b>`ListItem.Cast`</b>,
5885 /// \anchor ListItem_Cast
5887 /// @return A list of cast members\, separated by carriage returns.
5889 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Cast `ListItem.Cast`\endlink
5890 /// also supports EPG.
5893 /// \table_row3{ <b>`ListItem.CastAndRole`</b>,
5894 /// \anchor ListItem_CastAndRole
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.
5900 /// \table_row3{ <b>`ListItem.Studio`</b>,
5901 /// \anchor ListItem_Studio
5903 /// @return The studio of current selected Music Video in a container.
5906 /// \table_row3{ <b>`ListItem.Top250`</b>,
5907 /// \anchor ListItem_Top250
5909 /// @return The IMDb top250 position of the currently selected listitem in a
5913 /// \table_row3{ <b>`ListItem.Trailer`</b>,
5914 /// \anchor ListItem_Trailer
5916 /// @return The full trailer path with filename of the currently selected
5917 /// movie in a container.
5920 /// \table_row3{ <b>`ListItem.Writer`</b>,
5921 /// \anchor ListItem_Writer
5923 /// @return The name of Writer of current Video in a container.
5925 /// @skinning_v15 **[Infolabel Updated]** \link ListItem_Writer `ListItem.Writer`\endlink
5926 /// also supports EPG.
5929 /// \table_row3{ <b>`ListItem.Tag`</b>,
5930 /// \anchor ListItem_Tag
5932 /// @return The summary of current Video in a container.
5934 /// @skinning_v17 **[New Infolabel]** \link ListItem_Tag `ListItem.Tag`\endlink
5937 /// \table_row3{ <b>`ListItem.Tagline`</b>,
5938 /// \anchor ListItem_Tagline
5940 /// @return A Small Summary of current Video in a container.
5943 /// \table_row3{ <b>`ListItem.PlotOutline`</b>,
5944 /// \anchor ListItem_PlotOutline
5946 /// @return A small Summary of current Video in a container.
5949 /// \table_row3{ <b>`ListItem.Plot`</b>,
5950 /// \anchor ListItem_Plot
5952 /// @return The complete Text Summary of Video in a container.
5955 /// \table_row3{ <b>`ListItem.IMDBNumber`</b>,
5956 /// \anchor ListItem_IMDBNumber
5958 /// @return The IMDb ID of the selected Video in a container.
5960 /// @skinning_v15 **[New Infolabel]** \link ListItem_IMDBNumber `ListItem.IMDBNumber`\endlink
5963 /// \table_row3{ <b>`ListItem.EpisodeName`</b>,
5964 /// \anchor ListItem_EpisodeName
5966 /// @return The name of the episode if the selected EPG item is a TV Show (PVR).
5968 /// @skinning_v15 **[New Infolabel]** \link ListItem_EpisodeName `ListItem.EpisodeName`\endlink
5971 /// \table_row3{ <b>`ListItem.PercentPlayed`</b>,
5972 /// \anchor ListItem_PercentPlayed
5974 /// @return The percentage value [0-100] of how far the selected video has been
5978 /// \table_row3{ <b>`ListItem.LastPlayed`</b>,
5979 /// \anchor ListItem_LastPlayed
5981 /// @return The last play date of Video in a container.
5984 /// \table_row3{ <b>`ListItem.PlayCount`</b>,
5985 /// \anchor ListItem_PlayCount
5987 /// @return The playcount of Video in a container.
5990 /// \table_row3{ <b>`ListItem.ChannelName`</b>,
5991 /// \anchor ListItem_ChannelName
5993 /// @return The name of current selected TV channel in a container.
5996 /// \table_row3{ <b>`ListItem.ChannelLogo`</b>,
5997 /// \anchor ListItem_ChannelLogo
5999 /// @return The path for the logo of the currently selected radio or TV channel\, if available (PVR).
6001 /// @skinning_v22 **[New Infolabel]** \link ListItem_ChannelLogo `ListItem.ChannelLogo`\endlink
6004 /// \table_row3{ <b>`ListItem.VideoCodec`</b>,
6005 /// \anchor ListItem_VideoCodec
6007 /// @return The video codec of the currently selected video. Common values:
6018 /// - <b>microsoft</b>
6022 /// - <b>mpeg1video</b>
6023 /// - <b>mpeg2video</b>
6037 /// \table_row3{ <b>`ListItem.VideoResolution`</b>,
6038 /// \anchor ListItem_VideoResolution
6040 /// @return The resolution of the currently selected video. Possible values:
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.
6052 /// @skinning_v18 **[Updated Infolabel]** \link ListItem_VideoResolution ListItem.VideoResolution\endlink
6053 /// added <b>8K</b> as a possible value.
6056 /// \table_row3{ <b>`ListItem.VideoAspect`</b>,
6057 /// \anchor ListItem_VideoAspect
6059 /// @return The aspect ratio of the currently selected video. Possible values:
6075 /// \table_row3{ <b>`ListItem.AudioCodec`</b>,
6076 /// \anchor ListItem_AudioCodec
6078 /// @return The audio codec of the currently selected video. Common values:
6083 /// - <b>dtshd_hra</b>
6084 /// - <b>dtshd_ma</b>
6089 /// - <b>pcm_s16be</b>
6090 /// - <b>pcm_s16le</b>
6098 /// \table_row3{ <b>`ListItem.AudioChannels`</b>,
6099 /// \anchor ListItem_AudioChannels
6101 /// @return The number of audio channels of the currently selected video. Possible values:
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)
6115 /// \table_row3{ <b>`ListItem.AudioLanguage`</b>,
6116 /// \anchor ListItem_AudioLanguage
6118 /// @return The audio language of the currently selected video (an
6119 /// ISO 639-2 three character code: e.g. eng\, epo\, deu)
6122 /// \table_row3{ <b>`ListItem.SubtitleLanguage`</b>,
6123 /// \anchor ListItem_SubtitleLanguage
6125 /// @return The subtitle language of the currently selected video (an
6126 /// ISO 639-2 three character code: e.g. eng\, epo\, deu)
6129 /// \table_row3{ <b>`ListItem.Property(AudioCodec.[n])`</b>,
6130 /// \anchor ListItem_Property_AudioCodec
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")
6135 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioCodec `ListItem.Property(AudioCodec.[n])`\endlink
6138 /// \table_row3{ <b>`ListItem.Property(AudioChannels.[n])`</b>,
6139 /// \anchor ListItem_Property_AudioChannels
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")
6145 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioChannels `ListItem.Property(AudioChannels.[n])`\endlink
6148 /// \table_row3{ <b>`ListItem.Property(AudioLanguage.[n])`</b>,
6149 /// \anchor ListItem_Property_AudioLanguage
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")
6154 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioLanguage `ListItem.Property(AudioLanguage.[n])`\endlink
6157 /// \table_row3{ <b>`ListItem.Property(SubtitleLanguage.[n])`</b>,
6158 /// \anchor ListItem_Property_SubtitleLanguage
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")
6163 /// @skinning_v16 **[New Infolabel]** \link ListItem_Property_SubtitleLanguage `ListItem.Property(SubtitleLanguage.[n])`\endlink
6166 /// \table_row3{ <b>`ListItem.Property(Addon.Disclaimer)`</b>,
6167 /// \anchor ListItem_Property_AddonDisclaimer
6169 /// @return The disclaimer of the currently selected addon.
6172 /// \table_row3{ <b>`ListItem.Property(Addon.Changelog)`</b>,
6173 /// \anchor ListItem_Property_AddonChangelog
6175 /// @return The changelog of the currently selected addon.
6178 /// \table_row3{ <b>`ListItem.Property(Addon.ID)`</b>,
6179 /// \anchor ListItem_Property_AddonID
6181 /// @return The identifier of the currently selected addon.
6184 /// \table_row3{ <b>`ListItem.Property(Addon.Status)`</b>,
6185 /// \anchor ListItem_Property_AddonStatus
6187 /// @return The status of the currently selected addon.
6188 /// @todo missing reference in GuiInfoManager.cpp making it hard to track.
6191 /// \table_row3{ <b>`ListItem.Property(Addon.Orphaned)`</b>,
6192 /// \anchor ListItem_Property_AddonOrphaned
6194 /// @return **True** if the Addon is orphanad.
6195 /// @todo missing reference in GuiInfoManager.cpp making it hard to track.
6197 /// @skinning_v17 **[New Boolean Condition]** \link ListItem_Property_AddonOrphaned `ListItem.Property(Addon.Orphaned)`\endlink
6200 /// \table_row3{ <b>`ListItem.Property(Addon.Path)`</b>,
6201 /// \anchor ListItem_Property_AddonPath
6203 /// @return The path of the currently selected addon.
6206 /// \table_row3{ <b>`ListItem.StartTime`</b>,
6207 /// \anchor ListItem_StartTime
6209 /// @return The start time of current selected TV programme in a container.
6212 /// \table_row3{ <b>`ListItem.EndTime`</b>,
6213 /// \anchor ListItem_EndTime
6215 /// @return The end time of current selected TV programme in a container.
6218 /// \table_row3{ <b>`ListItem.StartDate`</b>,
6219 /// \anchor ListItem_StartDate
6221 /// @return The start date of current selected TV programme in a container.
6224 /// \table_row3{ <b>`ListItem.EndDate`</b>,
6225 /// \anchor ListItem_EndDate
6227 /// @return The end date of current selected TV programme in a container.
6230 /// \table_row3{ <b>`ListItem.NextTitle`</b>,
6231 /// \anchor ListItem_NextTitle
6233 /// @return The title of the next item (PVR).
6236 /// \table_row3{ <b>`ListItem.NextGenre`</b>,
6237 /// \anchor ListItem_NextGenre
6239 /// @return The genre of the next item (PVR).
6242 /// \table_row3{ <b>`ListItem.NextPlot`</b>,
6243 /// \anchor ListItem_NextPlot
6245 /// @return The plot of the next item (PVR).
6248 /// \table_row3{ <b>`ListItem.NextPlotOutline`</b>,
6249 /// \anchor ListItem_NextPlotOutline
6251 /// @return The plot outline of the next item (PVR).
6254 /// \table_row3{ <b>`ListItem.NextStartTime`</b>,
6255 /// \anchor ListItem_NextStartTime
6257 /// @return The start time of the next item (PVR).
6260 /// \table_row3{ <b>`ListItem.NextEndTime`</b>,
6261 /// \anchor ListItem_NextEndTime
6263 /// @return The end of the next item (PVR).
6266 /// \table_row3{ <b>`ListItem.NextStartDate`</b>,
6267 /// \anchor ListItem_NextStartDate
6269 /// @return The start date of the next item (PVR).
6272 /// \table_row3{ <b>`ListItem.NextEndDate`</b>,
6273 /// \anchor ListItem_NextEndDate
6275 /// @return The end date of the next item (PVR).
6278 /// \table_row3{ <b>`ListItem.NextDuration`</b>,
6279 /// \anchor ListItem_NextDuration
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.
6284 /// @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration `ListItem.NextDuration`\endlink
6287 /// \table_row3{ <b>`ListItem.NextDuration(format)`</b>,
6288 /// \anchor ListItem_NextDuration_format
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.
6294 /// @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration_format `ListItem.NextDuration(format)`\endlink
6297 /// \table_row3{ <b>`ListItem.ChannelGroup`</b>,
6298 /// \anchor ListItem_ChannelGroup
6300 /// @return The channel group of the selected item (PVR).
6303 /// \table_row3{ <b>`ListItem.ChannelNumberLabel`</b>,
6304 /// \anchor ListItem_ChannelNumberLabel
6306 /// @return The channel and subchannel number of the currently selected channel that's
6307 /// currently playing (PVR).
6309 /// @skinning_v14 **[New Infolabel]** \link ListItem_ChannelNumberLabel `ListItem.ChannelNumberLabel`\endlink
6312 /// \table_row3{ <b>`ListItem.Progress`</b>,
6313 /// \anchor ListItem_Progress
6315 /// @return The part of the programme that's been played (PVR).
6318 /// \table_row3{ <b>`ListItem.StereoscopicMode`</b>,
6319 /// \anchor ListItem_StereoscopicMode
6321 /// @return The stereomode of the selected video:
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>
6329 /// @skinning_v13 **[New Infolabel]** \link ListItem_StereoscopicMode `ListItem.StereoscopicMode`\endlink
6332 /// \table_row3{ <b>`ListItem.HasTimerSchedule`</b>,
6333 /// \anchor ListItem_HasTimerSchedule
6335 /// @return **True** if the item was scheduled by a timer rule (PVR).
6337 /// @skinning_v16 **[New Boolean Condition]** \ref ListItem_HasTimerSchedule "ListItem.HasTimerSchedule"
6340 /// \table_row3{ <b>`ListItem.HasReminder`</b>,
6341 /// \anchor ListItem_HasReminder
6343 /// @return **True** if the item has a reminder set (PVR).
6345 /// @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminder "ListItem.HasReminder"
6348 /// \table_row3{ <b>`ListItem.HasReminderRule`</b>,
6349 /// \anchor ListItem_ListItem.HasReminderRule
6351 /// @return **True** if the item was scheduled by a reminder timer rule (PVR).
6353 /// @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminderRule "ListItem.HasReminderRule"
6356 /// \table_row3{ <b>`ListItem.HasRecording`</b>,
6357 /// \anchor ListItem_HasRecording
6359 /// @return **True** if a given epg tag item currently gets recorded or has been recorded.
6362 /// \table_row3{ <b>`ListItem.TimerHasError`</b>,
6363 /// \anchor ListItem_TimerHasError
6365 /// @return **True** if the item has a timer and it won't be recorded because of an error (PVR).
6367 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasError "ListItem.TimerHasError"
6370 /// \table_row3{ <b>`ListItem.TimerHasConflict`</b>,
6371 /// \anchor ListItem_TimerHasConflict
6373 /// @return **True** if the item has a timer and it won't be recorded because of a conflict (PVR).
6375 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasConflict "ListItem.TimerHasConflict"
6378 /// \table_row3{ <b>`ListItem.TimerIsActive`</b>,
6379 /// \anchor ListItem_TimerIsActive
6381 /// @return **True** if the item has a timer that will be recorded\, i.e. the timer is enabled (PVR).
6383 /// @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerIsActive "ListItem.TimerIsActive"
6386 /// \table_row3{ <b>`ListItem.Comment`</b>,
6387 /// \anchor ListItem_Comment
6389 /// @return The comment assigned to the item (PVR/MUSIC).
6392 /// \table_row3{ <b>`ListItem.TimerType`</b>,
6393 /// \anchor ListItem_TimerType
6395 /// @return The type of the PVR timer / timer rule item as a human readable string.
6398 /// \table_row3{ <b>`ListItem.EpgEventTitle`</b>,
6399 /// \anchor ListItem_EpgEventTitle
6401 /// @return The title of the epg event associated with the item\, if any.
6404 /// \table_row3{ <b>`ListItem.EpgEventIcon`</b>,
6405 /// \anchor ListItem_EpgEventIcon
6407 /// @return The thumbnail for the EPG event associated with the item (if it exists).
6409 /// @skinning_v18 **[New Infolabel]** \link ListItem_EpgEventIcon `ListItem.EpgEventIcon`\endlink
6412 /// \table_row3{ <b>`ListItem.InProgress`</b>,
6413 /// \anchor ListItem_InProgress
6415 /// @return **True** if the EPG event item is currently active (time-wise).
6418 /// \table_row3{ <b>`ListItem.IsParentFolder`</b>,
6419 /// \anchor ListItem_IsParentFolder
6421 /// @return **True** if the current list item is the goto parent folder '..'.
6423 /// @skinning_v17 **[New Boolean Condition]** \link ListItem_IsParentFolder `ListItem.IsParentFolder`\endlink
6426 /// \table_row3{ <b>`ListItem.AddonName`</b>,
6427 /// \anchor ListItem_AddonName
6429 /// @return The name of the currently selected addon.
6431 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonName `ListItem.AddonName`\endlink
6432 /// replaces `ListItem.Property(Addon.Name)`.
6435 /// \table_row3{ <b>`ListItem.AddonVersion`</b>,
6436 /// \anchor ListItem_AddonVersion
6438 /// @return The version of the currently selected addon.
6440 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonVersion `ListItem.AddonVersion`\endlink
6441 /// replaces `ListItem.Property(Addon.Version)`.
6444 /// \table_row3{ <b>`ListItem.AddonCreator`</b>,
6445 /// \anchor ListItem_AddonCreator
6447 /// @return The name of the author the currently selected addon.
6449 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonCreator `ListItem.AddonCreator`\endlink
6450 /// replaces `ListItem.Property(Addon.Creator)`.
6453 /// \table_row3{ <b>`ListItem.AddonSummary`</b>,
6454 /// \anchor ListItem_AddonSummary
6456 /// @return A short description of the currently selected addon.
6458 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonSummary `ListItem.AddonSummary`\endlink
6459 /// replaces `ListItem.Property(Addon.Summary)`.
6462 /// \table_row3{ <b>`ListItem.AddonDescription`</b>,
6463 /// \anchor ListItem_AddonDescription
6465 /// @return The full description of the currently selected addon.
6467 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDescription `ListItem.AddonDescription`\endlink
6468 /// replaces `ListItem.Property(Addon.Description)`.
6471 /// \table_row3{ <b>`ListItem.AddonDisclaimer`</b>,
6472 /// \anchor ListItem_AddonDisclaimer
6474 /// @return The disclaimer of the currently selected addon.
6476 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDisclaimer `ListItem.AddonDisclaimer`\endlink
6477 /// replaces `ListItem.Property(Addon.Disclaimer)`.
6480 /// \table_row3{ <b>`ListItem.AddonBroken`</b>,
6481 /// \anchor ListItem_AddonBroken
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"
6487 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonBroken `ListItem.AddonBroken`\endlink
6488 /// replaces `ListItem.Property(Addon.Broken)`.
6491 /// \table_row3{ <b>`ListItem.AddonLifecycleType`</b>,
6492 /// \anchor ListItem_AddonLifecycleType
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
6499 /// @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleType `ListItem.AddonLifecycleType`\endlink
6500 /// replaces `ListItem.AddonBroken`.
6503 /// \table_row3{ <b>`ListItem.AddonLifecycleDesc`</b>,
6504 /// \anchor ListItem_AddonLifecycleDesc
6506 /// @return From addon defined message text when it is marked as special condition inside repository.
6508 /// @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleDesc `ListItem.AddonLifecycleDesc`\endlink
6509 /// replaces `ListItem.AddonBroken`.
6512 /// \table_row3{ <b>`ListItem.AddonType`</b>,
6513 /// \anchor ListItem_AddonType
6515 /// @return The type (screensaver\, script\, skin\, etc...) of the currently selected addon.
6517 /// @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonType `ListItem.AddonType`\endlink
6518 /// replaces `ListItem.Property(Addon.Type)`.
6521 /// \table_row3{ <b>`ListItem.AddonInstallDate`</b>,
6522 /// \anchor ListItem_AddonInstallDate
6524 /// @return The date the addon was installed.
6526 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonInstallDate `ListItem.AddonInstallDate`\endlink
6529 /// \table_row3{ <b>`ListItem.AddonLastUpdated`</b>,
6530 /// \anchor ListItem_AddonLastUpdated
6532 /// @return The date the addon was last updated.
6534 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUpdated `ListItem.AddonLastUpdated`\endlink
6537 /// \table_row3{ <b>`ListItem.AddonLastUsed`</b>,
6538 /// \anchor ListItem_AddonLastUsed
6540 /// @return The date the addon was used last.
6542 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUsed `ListItem.AddonLastUsed`\endlink
6545 /// \table_row3{ <b>`ListItem.AddonNews`</b>,
6546 /// \anchor ListItem_AddonNews
6548 /// @return A brief changelog\, taken from the addons' `addon.xml` file.
6550 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonNews `ListItem.AddonNews`\endlink
6553 /// \table_row3{ <b>`ListItem.AddonSize`</b>,
6554 /// \anchor ListItem_AddonSize
6556 /// @return The filesize of the addon.
6558 /// @skinning_v17 **[New Infolabel]** \link ListItem_AddonSize `ListItem.AddonSize`\endlink
6561 /// \table_row3{ <b>`ListItem.AddonOrigin`</b>,
6562 /// \anchor ListItem_AddonOrigin
6564 /// @return The name of the repository the add-on originates from.
6567 /// \table_row3{ <b>`ListItem.ExpirationDate`</b>,
6568 /// \anchor ListItem_ExpirationDate
6570 /// @return The expiration date of the selected item in a container\, empty string if not supported.
6573 /// \table_row3{ <b>`ListItem.ExpirationTime`</b>,
6574 /// \anchor ListItem_ExpirationTime
6576 /// @return The expiration time of the selected item in a container\, empty string if not supported
6579 /// \table_row3{ <b>`ListItem.Art(type)`</b>,
6580 /// \anchor ListItem_Art_Type
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.
6608 /// @todo Find a better way of finding the art types instead of manually defining them here.
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>
6614 /// \table_row3{ <b>`ListItem.Platform`</b>,
6615 /// \anchor ListItem_Platform
6617 /// @return The game platform (e.g. "Atari 2600") (RETROPLAYER).
6619 /// @skinning_v18 **[New Infolabel]** \link ListItem_Platform `ListItem.Platform`\endlink
6622 /// \table_row3{ <b>`ListItem.Genres`</b>,
6623 /// \anchor ListItem_Genres
6625 /// @return The game genres (e.g. "["Action"\,"Strategy"]") (RETROPLAYER).
6627 /// @skinning_v18 **[New Infolabel]** \link ListItem_Genres `ListItem.Genres`\endlink
6630 /// \table_row3{ <b>`ListItem.Publisher`</b>,
6631 /// \anchor ListItem_Publisher
6633 /// @return The game publisher (e.g. "Nintendo") (RETROPLAYER).
6635 /// @skinning_v18 **[New Infolabel]** \link ListItem_Publisher `ListItem.Publisher`\endlink
6638 /// \table_row3{ <b>`ListItem.Developer`</b>,
6639 /// \anchor ListItem_Developer
6641 /// @return The game developer (e.g. "Square") (RETROPLAYER).
6643 /// @skinning_v18 **[New Infolabel]** \link ListItem_Developer `ListItem.Developer`\endlink
6646 /// \table_row3{ <b>`ListItem.Overview`</b>,
6647 /// \anchor ListItem_Overview
6649 /// @return The game overview/summary (RETROPLAYER).
6651 /// @skinning_v18 **[New Infolabel]** \link ListItem_Overview `ListItem.Overview`\endlink
6654 /// \table_row3{ <b>`ListItem.GameClient`</b>,
6655 /// \anchor ListItem_GameClient
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).
6660 /// @skinning_v18 **[New Infolabel]** \link ListItem_GameClient `ListItem.GameClient`\endlink
6663 /// \table_row3{ <b>`ListItem.Property(propname)`</b>,
6664 /// \anchor ListItem_Property_Propname
6666 /// @return The requested property of a ListItem.
6667 /// @param propname - the property requested
6670 /// \table_row3{ <b>`ListItem.Property(Role.Composer)`</b>,
6671 /// \anchor ListItem_Property_Role_Composer
6673 /// @return The name of the person who composed the selected song.
6675 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Composer `ListItem.Property(Role.Composer)`\endlink
6678 /// \table_row3{ <b>`ListItem.Property(Role.Conductor)`</b>,
6679 /// \anchor ListItem_Property_Role_Conductor
6681 /// @return The name of the person who conducted the selected song.
6683 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Conductor `ListItem.Property(Role.Conductor)`\endlink
6686 /// \table_row3{ <b>`ListItem.Property(Role.Orchestra)`</b>,
6687 /// \anchor ListItem_Property_Role_Orchestra
6689 /// @return The name of the orchestra performing the selected song.
6691 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Orchestra `ListItem.Property(Role.Orchestra)`\endlink
6694 /// \table_row3{ <b>`ListItem.Property(Role.Lyricist)`</b>,
6695 /// \anchor ListItem_Property_Role_Lyricist
6697 /// @return The name of the person who wrote the lyrics of the selected song.
6699 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Lyricist `ListItem.Property(Role.Lyricist)`\endlink
6702 /// \table_row3{ <b>`ListItem.Property(Role.Remixer)`</b>,
6703 /// \anchor ListItem_Property_Role_Remixer
6705 /// @return The name of the person who remixed the selected song.
6707 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Remixer `ListItem.Property(Role.Remixer)`\endlink
6710 /// \table_row3{ <b>`ListItem.Property(Role.Arranger)`</b>,
6711 /// \anchor ListItem_Property_Role_Arranger
6713 /// @return The name of the person who arranged the selected song.
6715 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Arranger `ListItem.Property(Role.Arranger)`\endlink
6718 /// \table_row3{ <b>`ListItem.Property(Role.Engineer)`</b>,
6719 /// \anchor ListItem_Property_Role_Engineer
6721 /// @return The name of the person who was the engineer of the selected song.
6723 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Engineer `ListItem.Property(Role.Engineer)`\endlink
6726 /// \table_row3{ <b>`ListItem.Property(Role.Producer)`</b>,
6727 /// \anchor ListItem_Property_Role_Producer
6729 /// @return The name of the person who produced the selected song.
6731 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Producer `ListItem.Property(Role.Producer)`\endlink
6734 /// \table_row3{ <b>`ListItem.Property(Role.DJMixer)`</b>,
6735 /// \anchor ListItem_Property_Role_DJMixer
6737 /// @return The name of the dj who remixed the selected song.
6739 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6742 /// \table_row3{ <b>`ListItem.Property(Role.Mixer)`</b>,
6743 /// \anchor ListItem_Property_Role_Mixer
6745 /// @return The name of the person who mixed the selected song.
6747 /// @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6750 /// \table_row3{ <b>`ListItem.Property(Game.VideoFilter)`</b>,
6751 /// \anchor ListItem_Property_Game_VideoFilter
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.
6758 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoFilter `ListItem.Property(Game.VideoFilter)`\endlink
6761 /// \table_row3{ <b>`ListItem.Property(Game.StretchMode)`</b>,
6762 /// \anchor ListItem_Property_Game_StretchMode
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.
6769 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_StretchMode `ListItem.Property(Game.StretchMode)`\endlink
6772 /// \table_row3{ <b>`ListItem.Property(Game.VideoRotation)`</b>,
6773 /// \anchor ListItem_Property_Game_VideoRotation
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.
6780 /// @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoRotation `ListItem.Property(Game.VideoRotation)`\endlink
6783 /// \table_row3{ <b>`ListItem.ParentalRating`</b>,
6784 /// \anchor ListItem_ParentalRating
6786 /// @return The parental rating of the list item (PVR).
6789 /// \table_row3{ <b>`ListItem.ParentalRatingCode`</b>,
6790 /// \anchor ListItem_ParentalRatingCode
6792 /// @return The parental rating code (eg: 'PG'\, etc) of the list item (PVR).
6794 /// @skinning_v21 **[New Infolabel]** \link ListItem_ParentalRatingCode `ListItem.ParentalRatingCode`\endlink
6797 /// \table_row3{ <b>`ListItem.CurrentItem`</b>,
6798 /// \anchor ListItem_CurrentItem
6800 /// @return The current index of the item in a container starting at 1.
6802 /// @skinning_v19 **[New Infolabel]** \link ListItem_CurrentItem `ListItem.CurrentItem`\endlink
6805 /// \table_row3{ <b>`ListItem.IsNew`</b>,
6806 /// \anchor ListItem_IsNew
6808 /// @return **True** if the item is new (for example\, a Live TV show that will be first aired).
6810 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsNew `ListItem.IsNew`\endlink
6813 /// \table_row3{ <b>`ListItem.IsPremiere`</b>,
6814 /// \anchor ListItem_IsPremiere
6816 /// @return **True** if the item is a premiere (for example\, a Movie first showing or season first on Live TV).
6818 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsPremiere `ListItem.IsPremiere`\endlink
6821 /// \table_row3{ <b>`ListItem.IsFinale`</b>,
6822 /// \anchor ListItem_IsFinale
6824 /// @return **True** if the item is a finale (for example\, a season finale showing on Live TV).
6826 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsFinale `ListItem.IsFinale`\endlink
6829 /// \table_row3{ <b>`ListItem.IsLive`</b>,
6830 /// \anchor ListItem_IsLive
6832 /// @return **True** if the item is live (for example\, a Live TV sports event).
6834 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsLive `ListItem.IsLive`\endlink
6837 /// \table_row3{ <b>`ListItem.DiscTitle`</b>,
6838 /// \anchor ListItem_DiscTitle
6840 /// @return The disc title of the currently selected album or song.
6842 /// @skinning_v19 **[New Infolabel]** \link ListItem_DiscTitle `ListItem.DiscTitle`\endlink
6845 /// \table_row3{ <b>`ListItem.IsBoxset`</b>,
6846 /// \anchor ListItem_IsBoxset
6848 /// @return **True** if the item is part of a boxset album.
6850 /// @skinning_v19 **[New Infolabel]** \link ListItem_IsBoxset `ListItem.IsBoxset`\endlink
6853 /// \table_row3{ <b>`ListItem.TotalDiscs`</b>,
6854 /// \anchor ListItem_TotalDiscs
6856 /// @return The total number of discs belonging to an album.
6858 /// @skinning_v19 **[New Infolabel]** \link ListItem_TotalDiscs `ListItem.TotalDiscs`\endlink
6861 /// \table_row3{ <b>`ListItem.ReleaseDate`</b>,
6862 /// \anchor ListItem_ReleaseDate
6864 /// @return The release date of the item.
6866 /// @skinning_v19 **[New Infolabel]** \link ListItem_ReleaseDate `ListItem.ReleaseDate`\endlink
6869 /// \table_row3{ <b>`ListItem.OriginalDate`</b>,
6870 /// \anchor ListItem_OriginalDate
6872 /// @return The original release date of the item. Can be full or partial date.
6874 /// @skinning_v19 **[New Infolabel]** \link ListItem_OriginalDate `ListItem.OriginalDate`\endlink
6877 /// \table_row3{ <b>`ListItem.BPM`</b>,
6878 /// \anchor ListItem_BPM
6880 /// @return The BPM of a song.
6882 /// @skinning_v19 **[New Infolabel]** \link ListItem_BPM `ListItem.BPM`\endlink
6885 /// \table_row3{ <b>`ListItem.UniqueID(name)`</b>,
6886 /// \anchor ListItem_UniqueID
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.
6892 /// @skinning_v19 **[New Infolabel]** \link ListItem_UniqueID `ListItem.UniqueID(name)`\endlink
6895 /// \table_row3{ <b>`ListItem.BitRate`</b>,
6896 /// \anchor ListItem_BitRate
6898 /// @return The bitrate of a song. Actual rate for CBR\, average rate for VBR.
6900 /// @skinning_v19 **[New Infolabel]** \link ListItem_BitRate `ListItem.BitRate`\endlink
6903 /// \table_row3{ <b>`ListItem.SampleRate`</b>,
6904 /// \anchor ListItem_SampleRate
6906 /// @return The sample rate of a song / 1000.0 eg 44.1\, 48\, 96 etc.
6908 /// @skinning_v19 **[New Infolabel]** \link ListItem_SampleRate `ListItem.SampleRate`\endlink
6911 /// \table_row3{ <b>`ListItem.MusicChannels`</b>,
6912 /// \anchor ListItem_MusicChannels
6914 /// @return The number of audio channels of a song.
6916 /// @skinning_v19 **[New Infolabel]** \link ListItem_No_Of_Channels `ListItem.NoOfChannels`\endlink
6919 /// \table_row3{ <b>`ListItem.TvShowDBID`</b>,
6920 /// \anchor ListItem_TvShowDBID
6922 /// @return The database id of the TvShow for the currently selected Season or Episode.
6924 /// @skinning_v19 **[New Infolabel]** \link ListItem_TvShowDBID `ListItem.TvShowDBID`\endlink
6927 /// \table_row3{ <b>`ListItem.AlbumStatus`</b>,
6928 /// \anchor ListItem_AlbumStatus
6930 /// @return The Musicbrainz release status of the album (official\, bootleg\, promotion etc)
6932 /// @skinning_v19 **[New Infolabel]** \link ListItem_AlbumStatus `ListItem.AlbumStatus`\endlink
6934 /// \table_row3{ <b>`ListItem.HdrType`</b>,
6935 /// \anchor ListItem_HdrType
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.
6939 /// @skinning_v20 **[New Infolabel]** \link ListItem_HdrType `ListItem.HdrType`\endlink
6941 /// \table_row3{ <b>`ListItem.SongVideoURL`</b>,
6942 /// \anchor ListItem_SongVideoURL
6944 /// @return Link to a video of a song
6946 /// @skinning_v21 **[New Infolabel]** \link ListItem_SongVideoURL `ListItem.SongVideoURL`\endlink
6948 /// \table_row3{ <b>`ListItem.VideoWidth`</b>,
6949 /// \anchor ListItem_VideoWidth
6951 /// @return String containing width of video in pixels - empty if unknown.
6953 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoWidth `ListItem.VideoWidth`\endlink
6955 /// \table_row3{ <b>`ListItem.VideoHeight`</b>,
6956 /// \anchor ListItem_VideoHeight
6958 /// @return String containing height of video in pixels - empty if unknown.
6960 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoHeight `ListItem.VideoHeight`\endlink
6962 /// \table_row3{ <b>`ListItem.HasVideoVersions`</b>,
6963 /// \anchor ListItem_HasVideoVersions
6965 /// @return **True** when the selected item has multiple video versions.
6967 /// @skinning_v21 **[New Infolabel]** \link ListItem_HasVideoVersions `ListItem.HasVideoVersions`\endlink
6969 /// \table_row3{ <b>`ListItem.IsVideoExtra`</b>,
6970 /// \anchor ListItem_IsVideoExtra
6972 /// @return **True** when the selected item is a video extra.
6974 /// @skinning_v21 **[New Infolabel]** \link ListItem_IsVideoExtra `ListItem.IsVideoExtra`\endlink
6976 /// \table_row3{ <b>`ListItem.VideoVersionName`</b>,
6977 /// \anchor ListItem_VideoVersionName
6979 /// @return String containing the name of the version of a video - empty for extras or if no version available
6981 /// @skinning_v21 **[New Infolabel]** \link ListItem_VideoVersionName `ListItem.VideoVersionName`\endlink
6983 /// \table_row3{ <b>`ListItem.HasVideoExtras`</b>,
6984 /// \anchor ListItem_HasVideoExtras
6986 /// @return **True** when the selected item has video extras.
6988 /// @skinning_v21 **[New Infolabel]** \link ListItem_HasVideoExtras `ListItem.HasVideoExtras`\endlink
6990 /// \table_row3{ <b>`ListItem.PVRClientName`</b>,
6991 /// \anchor ListItem_PVRClientName
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.
6996 /// @skinning_v22 **[New Infolabel]** \link ListItem_PVRClientName `ListItem.PVRClientName`\endlink
6999 /// \table_row3{ <b>`ListItem.PVRInstanceName`</b>,
7000 /// \anchor ListItem_PVRInstanceName
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.
7006 /// @skinning_v22 **[New Infolabel]** \link ListItem_PVRInstanceName `ListItem.PVRInstanceName`\endlink
7011 /// -----------------------------------------------------------------------------
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
},
7236 /// \page modules__infolabels_boolean_conditions
7237 /// \subsection modules__infolabels_boolean_conditions_Visualisation Visualisation
7239 /// \table_h3{ Labels, Type, Description }
7240 /// \table_row3{ <b>`Visualisation.Enabled`</b>,
7241 /// \anchor Visualisation_Enabled
7243 /// @return **True** if any visualisation has been set in settings (so not None).
7246 /// \table_row3{ <b>`Visualisation.HasPresets`</b>,
7247 /// \anchor Visualisation_HasPresets
7249 /// @return **True** if the visualisation has built in presets.
7251 /// @skinning_v16 **[New Boolean Condition]** \link Visualisation_HasPresets `Visualisation.HasPresets`\endlink
7254 /// \table_row3{ <b>`Visualisation.Locked`</b>,
7255 /// \anchor Visualisation_Locked
7257 /// @return **True** if the current visualisation preset is locked (e.g. in Milkdrop).
7260 /// \table_row3{ <b>`Visualisation.Preset`</b>,
7261 /// \anchor Visualisation_Preset
7263 /// @return The current preset of the visualisation.
7266 /// \table_row3{ <b>`Visualisation.Name`</b>,
7267 /// \anchor Visualisation_Name
7269 /// @return the name of the visualisation.
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
7284 /// \table_h3{ Labels, Type, Description }
7285 /// \table_row3{ <b>`Fanart.Color1`</b>,
7286 /// \anchor Fanart_Color1
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.
7293 /// \table_row3{ <b>`Fanart.Color2`</b>,
7294 /// \anchor Fanart_Color2
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.
7301 /// \table_row3{ <b>`Fanart.Color3`</b>,
7302 /// \anchor Fanart_Color3
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.
7309 /// \table_row3{ <b>`Fanart.Image`</b>,
7310 /// \anchor Fanart_Image
7312 /// @return The fanart image\, if any
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
7326 /// \table_h3{ Labels, Type, Description }
7327 /// \table_row3{ <b>`Skin.HasSetting(setting)`</b>,
7328 /// \anchor Skin_HasSetting
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])`
7335 /// \table_row3{ <b>`Skin.String(setting)`</b>,
7336 /// \anchor Skin_StringValue
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
7343 /// \table_row3{ <b>`Skin.String(setting[\,value])`</b>,
7344 /// \anchor Skin_StringCompare
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
7352 /// \table_row3{ <b>`Skin.HasTheme(theme)`</b>,
7353 /// \anchor Skin_HasTheme
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.
7360 /// \table_row3{ <b>`Skin.CurrentTheme`</b>,
7361 /// \anchor Skin_CurrentTheme
7363 /// @return The current selected skin theme.
7366 /// \table_row3{ <b>`Skin.CurrentColourTheme`</b>,
7367 /// \anchor Skin_CurrentColourTheme
7369 /// @return the current selected colour theme of the skin.
7372 /// \table_row3{ <b>`Skin.AspectRatio`</b>,
7373 /// \anchor Skin_AspectRatio
7375 /// @return The closest aspect ratio match using the resolution info from the skin's `addon.xml` file.
7378 /// \table_row3{ <b>`Skin.Font`</b>,
7379 /// \anchor Skin_Font
7381 /// @return the current fontset from `Font.xml`.
7383 /// @skinning_v18 **[New Infolabel]** \link Skin_Font `Skin.Font`\endlink
7386 /// \table_row3{ <b>`Skin.Numeric(settingid)`</b>,
7387 /// \anchor Skin_Numeric
7389 /// @return return the setting value as an integer/numeric value.
7390 /// @sa \link Skin_SetNumeric `Skin.SetNumeric(settingid)`\endlink
7392 /// @skinning_v20 **[New Infolabel]** \link Skin_Numeric `Skin.Numeric(settingid)`\endlink
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
7401 /// @skinning_v20 **[New Infolabel]** \link Skin_TimerElapsedSecs `Skin.TimerElapsedSecs(timer)`\endlink
7404 /// \table_row3{ <b>`Skin.TimerIsRunning(timer)`</b>,
7405 /// \anchor Skin_TimerIsRunning
7407 /// @return **True** if the given `timer` is active\, false otherwise.
7408 /// @param timer - the timer name
7410 /// @skinning_v20 **[New Infolabel]** \link Skin_TimerIsRunning `Skin.TimerIsRunning(timer)`\endlink
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
7424 /// \table_h3{ Labels, Type, Description }
7425 /// \table_row3{ <b>`Window.IsMedia`</b>,
7426 /// \anchor Window_IsMedia
7428 /// @return **True** if this window is a media window (programs\, music\, video\,
7429 /// scripts\, pictures)
7432 /// \table_row3{ <b>`Window.Is(window)`</b>,
7433 /// \anchor Window_Is
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.
7439 /// @skinning_v17 **[New Boolean Condition]** \ref Window_Is "Window.Is(window)"
7442 /// \table_row3{ <b>`Window.IsActive(window)`</b>,
7443 /// \anchor Window_IsActive
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
7450 /// \table_row3{ <b>`Window.IsVisible(window)`</b>,
7451 /// \anchor Window_IsVisible
7453 /// @return **True** if the window is visible
7454 /// @note Includes fade out time on dialogs
7457 /// \table_row3{ <b>`Window.IsTopmost(window)`</b>,
7458 /// \anchor Window_IsTopmost
7460 /// @return **True** if the window with id or title _window_ is on top of the
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
7467 /// \table_row3{ <b>`Window.IsDialogTopmost(dialog)`</b>,
7468 /// \anchor Window_IsDialogTopmost
7470 /// @return **True** if the dialog with id or title _dialog_ is on top of the
7472 /// @param window - the id or name of the window
7473 /// @note Excludes fade out time on dialogs
7476 /// \table_row3{ <b>`Window.IsModalDialogTopmost(dialog)`</b>,
7477 /// \anchor Window_IsModalDialogTopmost
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
7484 /// \table_row3{ <b>`Window.Previous(window)`</b>,
7485 /// \anchor Window_Previous
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.
7492 /// \table_row3{ <b>`Window.Next(window)`</b>,
7493 /// \anchor Window_Next
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.
7500 /// \table_row3{ <b>`Window.Property(Addon.ID)`</b>,
7501 /// \anchor Window_Property_AddonId
7503 /// @return The id of the selected addon\, in `DialogAddonSettings.xml`.
7505 /// @skinning_v17 **[New Infolabel]** \link Window_Property_AddonId `Window.Property(Addon.ID)`\endlink
7508 /// \table_row3{ <b>`Window.Property(IsRadio)`</b>,
7509 /// \anchor Window_Property_IsRadio
7511 /// @return "true" if the window is a radio window\, empty string otherwise (for use in the PVR windows).
7514 /// \table_row3{ <b>`Window([window]).Property(key)`</b>,
7515 /// \anchor Window_Window_Property_key
7517 /// @return A window property.
7518 /// @param window - [opt] window id or name.
7519 /// @param key - any value.
7522 /// \table_row3{ <b>`Window(AddonBrowser).Property(Updated)`</b>,
7523 /// \anchor Window_Addonbrowser_Property_Updated
7525 /// @return The date and time the addon repo was last checked for updates.
7526 /// @todo move to a future window document.
7528 /// @skinning_v15 **[New Infolabel]** \link Window_Addonbrowser_Property_Updated `Window(AddonBrowser).Property(Updated)`\endlink
7531 /// \table_row3{ <b>`Window(Weather).Property(property)`</b>,
7532 /// \anchor Window_Weather_Property
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.
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
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).
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
7578 /// \table_h3{ Labels, Type, Description }
7579 /// \table_row3{ <b>`Control.HasFocus(id)`</b>,
7580 /// \anchor Control_HasFocus
7582 /// @return **True** if the currently focused control has id "id".
7583 /// @param id - The id of the control
7586 /// \table_row3{ <b>`Control.IsVisible(id)`</b>,
7587 /// \anchor Control_IsVisible
7589 /// @return **True** if the control with id "id" is visible.
7590 /// @param id - The id of the control
7593 /// \table_row3{ <b>`Control.IsEnabled(id)`</b>,
7594 /// \anchor Control_IsEnabled
7596 /// @return **True** if the control with id "id" is enabled.
7597 /// @param id - The id of the control
7600 /// \table_row3{ <b>`Control.GetLabel(id)[.index()]`</b>,
7601 /// \anchor Control_GetLabel
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
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
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
7626 /// \table_h3{ Labels, Type, Description }
7627 /// \table_row3{ <b>`Playlist.Length(media)`</b>,
7628 /// \anchor Playlist_Length
7630 /// @return The total size of the current playlist.
7631 /// @param media - [opt] mediatype with is either
7635 /// \table_row3{ <b>`Playlist.Position(media)`</b>,
7636 /// \anchor Playlist_Position
7638 /// @return The position of the current item in the current playlist.
7639 /// @param media - [opt] mediatype with is either
7643 /// \table_row3{ <b>`Playlist.Random`</b>,
7644 /// \anchor Playlist_Random
7646 /// @return String ID for the random mode:
7647 /// - **16041** (On)
7650 /// @skinning_v18 **[Infolabel Updated]** \link Playlist_Random `Playlist.Random`\endlink will
7651 /// now return **On/Off**
7654 /// \table_row3{ <b>`Playlist.Repeat`</b>,
7655 /// \anchor Playlist_Repeat
7657 /// @return The String Id for the repeat mode. It can be one of the following
7659 /// - **592** (Repeat One)
7660 /// - **593** (Repeat All)
7661 /// - **594** (Repeat Off)
7664 /// \table_row3{ <b>`Playlist.IsRandom`</b>,
7665 /// \anchor Playlist_IsRandom
7667 /// @return **True** if the player is in random mode.
7670 /// \table_row3{ <b>`Playlist.IsRepeat`</b>,
7671 /// \anchor Playlist_IsRepeat
7673 /// @return **True** if the player is in repeat all mode.
7676 /// \table_row3{ <b>`Playlist.IsRepeatOne`</b>,
7677 /// \anchor Playlist_IsRepeatOne
7679 /// @return **True** if the player is in repeat one mode.
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
7696 /// \table_h3{ Labels, Type, Description }
7697 /// \table_row3{ <b>`PVR.IsRecording`</b>,
7698 /// \anchor PVR_IsRecording
7700 /// @return **True** when the system is recording a tv or radio programme.
7703 /// \table_row3{ <b>`PVR.HasTimer`</b>,
7704 /// \anchor PVR_HasTimer
7706 /// @return **True** when a recording timer is active.
7709 /// \table_row3{ <b>`PVR.HasTVChannels`</b>,
7710 /// \anchor PVR_HasTVChannels
7712 /// @return **True** if there are TV channels available.
7715 /// \table_row3{ <b>`PVR.HasRadioChannels`</b>,
7716 /// \anchor PVR_HasRadioChannels
7718 /// @return **True** if there are radio channels available.
7721 /// \table_row3{ <b>`PVR.HasNonRecordingTimer`</b>,
7722 /// \anchor PVR_HasNonRecordingTimer
7724 /// @return **True** if there are timers present who currently not do recording.
7727 /// \table_row3{ <b>`PVR.BackendName`</b>,
7728 /// \anchor PVR_BackendName
7730 /// @return The name of the backend being used.
7733 /// \table_row3{ <b>`PVR.BackendVersion`</b>,
7734 /// \anchor PVR_BackendVersion
7736 /// @return The version of the backend that's being used.
7739 /// \table_row3{ <b>`PVR.BackendHost`</b>,
7740 /// \anchor PVR_BackendHost
7742 /// @return The backend hostname.
7745 /// \table_row3{ <b>`PVR.BackendDiskSpace`</b>,
7746 /// \anchor PVR_BackendDiskSpace
7748 /// @return The available diskspace on the backend as string with size.
7751 /// \table_row3{ <b>`PVR.BackendDiskSpaceProgr`</b>,
7752 /// \anchor PVR_BackendDiskSpaceProgr
7754 /// @return The available diskspace on the backend as percent value.
7756 /// @skinning_v14 **[New Infolabel]** \link PVR_BackendDiskSpaceProgr `PVR.BackendDiskSpaceProgr`\endlink
7759 /// \table_row3{ <b>`PVR.BackendChannels`</b>,
7760 /// \anchor PVR_BackendChannels
7761 /// _string (integer)_,
7762 /// @return The number of available channels the backend provides.
7765 /// \table_row3{ <b>`PVR.BackendTimers`</b>,
7766 /// \anchor PVR_BackendTimers
7767 /// _string (integer)_,
7768 /// @return The number of timers set for the backend.
7771 /// \table_row3{ <b>`PVR.BackendRecordings`</b>,
7772 /// \anchor PVR_BackendRecordings
7773 /// _string (integer)_,
7774 /// @return The number of recordings available on the backend.
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.
7783 /// \table_row3{ <b>`PVR.BackendNumber`</b>,
7784 /// \anchor PVR_BackendNumber
7786 /// @return The backend number.
7789 /// \table_row3{ <b>`PVR.TotalDiscSpace`</b>,
7790 /// \anchor PVR_TotalDiscSpace
7792 /// @return The total diskspace available for recordings.
7795 /// \table_row3{ <b>`PVR.NextTimer`</b>,
7796 /// \anchor PVR_NextTimer
7798 /// @return The next timer date.
7801 /// \table_row3{ <b>`PVR.IsPlayingTV`</b>,
7802 /// \anchor PVR_IsPlayingTV
7804 /// @return **True** when live tv is being watched.
7807 /// \table_row3{ <b>`PVR.IsPlayingRadio`</b>,
7808 /// \anchor PVR_IsPlayingRadio
7810 /// @return **True** when live radio is being listened to.
7813 /// \table_row3{ <b>`PVR.IsPlayingRecording`</b>,
7814 /// \anchor PVR_IsPlayingRecording
7816 /// @return **True** when a recording is being watched.
7819 /// \table_row3{ <b>`PVR.IsPlayingEpgTag`</b>,
7820 /// \anchor PVR_IsPlayingEpgTag
7822 /// @return **True** when an epg tag is being watched.
7825 /// \table_row3{ <b>`PVR.EpgEventProgress`</b>,
7826 /// \anchor PVR_EpgEventProgress
7828 /// @return The percentage complete of the currently playing epg event.
7830 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventProgress `PVR.EpgEventProgress`\endlink replaces
7831 /// the old `PVR.Progress` infolabel.
7834 /// \table_row3{ <b>`PVR.ActStreamClient`</b>,
7835 /// \anchor PVR_ActStreamClient
7837 /// @return The stream client name.
7840 /// \table_row3{ <b>`PVR.ActStreamDevice`</b>,
7841 /// \anchor PVR_ActStreamDevice
7843 /// @return The stream device name.
7846 /// \table_row3{ <b>`PVR.ActStreamStatus`</b>,
7847 /// \anchor PVR_ActStreamStatus
7849 /// @return The status of the stream.
7852 /// \table_row3{ <b>`PVR.ActStreamSignal`</b>,
7853 /// \anchor PVR_ActStreamSignal
7855 /// @return The signal quality of the stream.
7858 /// \table_row3{ <b>`PVR.ActStreamSnr`</b>,
7859 /// \anchor PVR_ActStreamSnr
7861 /// @return The signal to noise ratio of the stream.
7864 /// \table_row3{ <b>`PVR.ActStreamBer`</b>,
7865 /// \anchor PVR_ActStreamBer
7867 /// @return The bit error rate of the stream.
7870 /// \table_row3{ <b>`PVR.ActStreamUnc`</b>,
7871 /// \anchor PVR_ActStreamUnc
7873 /// @return The UNC value of the stream.
7876 /// \table_row3{ <b>`PVR.ActStreamProgrSignal`</b>,
7877 /// \anchor PVR_ActStreamProgrSignal
7879 /// @return The signal quality of the programme.
7882 /// \table_row3{ <b>`PVR.ActStreamProgrSnr`</b>,
7883 /// \anchor PVR_ActStreamProgrSnr
7885 /// @return The signal to noise ratio of the programme.
7888 /// \table_row3{ <b>`PVR.ActStreamIsEncrypted`</b>,
7889 /// \anchor PVR_ActStreamIsEncrypted
7891 /// @return **True** when channel is encrypted on source.
7894 /// \table_row3{ <b>`PVR.ActStreamEncryptionName`</b>,
7895 /// \anchor PVR_ActStreamEncryptionName
7897 /// @return The encryption used on the stream.
7900 /// \table_row3{ <b>`PVR.ActStreamServiceName`</b>,
7901 /// \anchor PVR_ActStreamServiceName
7903 /// @return The service name of played channel if available.
7906 /// \table_row3{ <b>`PVR.ActStreamMux`</b>,
7907 /// \anchor PVR_ActStreamMux
7909 /// @return The multiplex type of played channel if available.
7912 /// \table_row3{ <b>`PVR.ActStreamProviderName`</b>,
7913 /// \anchor PVR_ActStreamProviderName
7915 /// @return The provider name of the played channel if available.
7918 /// \table_row3{ <b>`PVR.IsTimeShift`</b>,
7919 /// \anchor PVR_IsTimeShift
7921 /// @return **True** when for channel is timeshift available.
7924 /// \table_row3{ <b>`PVR.TimeShiftProgress`</b>,
7925 /// \anchor PVR_TimeShiftProgress
7927 /// @return The position of currently timeshifted title on TV as integer.
7930 /// \table_row3{ <b>`PVR.TimeShiftSeekbar`</b>,
7931 /// \anchor PVR_TimeShiftSeekbar
7933 /// @return The percentage we are seeking to in a timeshifted title.
7935 /// @skinning_v19 **[New Infolabel]** \link PVR_TimeShiftSeekbar `PVR.TimeShiftSeekbar`\endlink
7938 /// \table_row3{ <b>`PVR.NowRecordingTitle`</b>,
7939 /// \anchor PVR_NowRecordingTitle
7941 /// @return The title of the programme being recorded.
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.
7950 /// \table_row3{ <b>`PVR.NowRecordingChannel`</b>,
7951 /// \anchor PVR_NowRecordingChannel
7953 /// @return The channel name of the current recording.
7956 /// \table_row3{ <b>`PVR.NowRecordingChannelIcon`</b>,
7957 /// \anchor PVR_NowRecordingChannelIcon
7959 /// @return The icon of the current recording channel.
7962 /// \table_row3{ <b>`PVR.NextRecordingTitle`</b>,
7963 /// \anchor PVR_NextRecordingTitle
7965 /// @return The title of the next programme that will be recorded.
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.
7974 /// \table_row3{ <b>`PVR.NextRecordingChannel`</b>,
7975 /// \anchor PVR_NextRecordingChannel
7977 /// @return The channel name of the next recording.
7980 /// \table_row3{ <b>`PVR.NextRecordingChannelIcon`</b>,
7981 /// \anchor PVR_NextRecordingChannelIcon
7983 /// @return The icon of the next recording channel.
7986 /// \table_row3{ <b>`PVR.TVNowRecordingTitle`</b>,
7987 /// \anchor PVR_TVNowRecordingTitle
7989 /// @return The title of the tv programme being recorded.
7991 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingTitle `PVR.TVNowRecordingTitle`\endlink
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.
7999 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingDateTime `PVR.TVNowRecordingDateTime`\endlink
8002 /// \table_row3{ <b>`PVR.TVNowRecordingChannel`</b>,
8003 /// \anchor PVR_TVNowRecordingChannel
8005 /// @return The channel name of the current tv recording.
8007 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannel `PVR.TVNowRecordingChannel`\endlink
8010 /// \table_row3{ <b>`PVR.TVNowRecordingChannelIcon`</b>,
8011 /// \anchor PVR_TVNowRecordingChannelIcon
8013 /// @return The icon of the current recording TV channel.
8015 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannelIcon `PVR.TVNowRecordingChannelIcon`\endlink
8018 /// \table_row3{ <b>`PVR.TVNextRecordingTitle`</b>,
8019 /// \anchor PVR_TVNextRecordingTitle
8021 /// @return The title of the next tv programme that will be recorded.
8023 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingTitle `PVR.TVNextRecordingTitle`\endlink
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.
8031 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingDateTime `PVR.TVNextRecordingDateTime`\endlink
8034 /// \table_row3{ <b>`PVR.TVNextRecordingChannel`</b>,
8035 /// \anchor PVR_TVNextRecordingChannel
8037 /// @return The channel name of the next tv recording.
8039 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannel `PVR.TVNextRecordingChannel`\endlink
8042 /// \table_row3{ <b>`PVR.TVNextRecordingChannelIcon`</b>,
8043 /// \anchor PVR_TVNextRecordingChannelIcon
8045 /// @return The icon of the next recording tv channel.
8047 /// @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannelIcon `PVR.TVNextRecordingChannelIcon`\endlink
8050 /// \table_row3{ <b>`PVR.RadioNowRecordingTitle`</b>,
8051 /// \anchor PVR_RadioNowRecordingTitle
8053 /// @return The title of the radio programme being recorded.
8055 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingTitle `PVR.RadioNowRecordingTitle`\endlink
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.
8063 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingDateTime `PVR.RadioNowRecordingDateTime`\endlink
8066 /// \table_row3{ <b>`PVR.RadioNowRecordingChannel`</b>,
8067 /// \anchor PVR_RadioNowRecordingChannel
8069 /// @return The channel name of the current radio recording.
8071 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannel `PVR.RadioNowRecordingChannel`\endlink
8074 /// \table_row3{ <b>`PVR.RadioNowRecordingChannelIcon`</b>,
8075 /// \anchor PVR_RadioNowRecordingChannelIcon
8077 /// @return The icon of the current recording radio channel.
8079 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannelIcon `PVR.RadioNowRecordingChannelIcon`\endlink
8082 /// \table_row3{ <b>`PVR.RadioNextRecordingTitle`</b>,
8083 /// \anchor PVR_RadioNextRecordingTitle
8085 /// @return The title of the next radio programme that will be recorded.
8087 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingTitle `PVR.RadioNextRecordingTitle`\endlink
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.
8095 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingDateTime `PVR.RadioNextRecordingDateTime`\endlink
8098 /// \table_row3{ <b>`PVR.RadioNextRecordingChannel`</b>,
8099 /// \anchor PVR_RadioNextRecordingChannel
8101 /// @return The channel name of the next radio recording.
8103 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannel `PVR.RadioNextRecordingChannel`\endlink
8106 /// \table_row3{ <b>`PVR.RadioNextRecordingChannelIcon`</b>,
8107 /// \anchor PVR_RadioNextRecordingChannelIcon
8109 /// @return The icon of the next recording radio channel.
8111 /// @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannelIcon `PVR.RadioNextRecordingChannelIcon`\endlink
8114 /// \table_row3{ <b>`PVR.IsRecordingTV`</b>,
8115 /// \anchor PVR_IsRecordingTV
8117 /// @return **True** when the system is recording a tv programme.
8119 /// @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingTV `PVR.IsRecordingTV`\endlink
8122 /// \table_row3{ <b>`PVR.HasTVTimer`</b>,
8123 /// \anchor PVR_HasTVTimer
8125 /// @return **True** if at least one tv timer is active.
8127 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasTVTimer `PVR.HasTVTimer`\endlink
8130 /// \table_row3{ <b>`PVR.HasNonRecordingTVTimer`</b>,
8131 /// \anchor PVR_HasNonRecordingTVTimer
8133 /// @return **True** if there are tv timers present who currently not do recording.
8135 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingTVTimer `PVR.HasNonRecordingTVTimer`\endlink
8138 /// \table_row3{ <b>`PVR.IsRecordingRadio`</b>,
8139 /// \anchor PVR_IsRecordingRadio
8141 /// @return **True** when the system is recording a radio programme.
8143 /// @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingRadio `PVR.IsRecordingRadio`\endlink
8146 /// \table_row3{ <b>`PVR.HasRadioTimer`</b>,
8147 /// \anchor PVR_HasRadioTimer
8149 /// @return **True** if at least one radio timer is active.
8151 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasRadioTimer `PVR.HasRadioTimer`\endlink
8154 /// \table_row3{ <b>`PVR.HasNonRecordingRadioTimer`</b>,
8155 /// \anchor PVR_HasNonRecordingRadioTimer
8157 /// @return **True** if there are radio timers present who currently not do recording.
8159 /// @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingRadioTimer `PVR.HasRadioTimer`\endlink
8162 /// \table_row3{ <b>`PVR.ChannelNumberInput`</b>,
8163 /// \anchor PVR_ChannelNumberInput
8165 /// @return The currently entered channel number while in numeric channel input mode\, an empty string otherwise.
8167 /// @skinning_v18 **[New Infolabel]** \link PVR_ChannelNumberInput `PVR.ChannelNumberInput`\endlink
8170 /// \table_row3{ <b>`PVR.CanRecordPlayingChannel`</b>,
8171 /// \anchor PVR_CanRecordPlayingChannel
8173 /// @return **True** if PVR is currently playing a channel and if this channel can be recorded.
8175 /// @skinning_v18 **[Infolabel Updated]** \link PVR_CanRecordPlayingChannel `PVR.CanRecordPlayingChannel`\endlink replaces
8176 /// the old `Player.CanRecord` infolabel.
8179 /// \table_row3{ <b>`PVR.IsRecordingPlayingChannel`</b>,
8180 /// \anchor PVR_IsRecordingPlayingChannel
8182 /// @return **True** if PVR is currently playing a channel and if this channel is currently recorded.
8184 /// @skinning_v18 **[Infolabel Updated]** \link PVR_IsRecordingPlayingChannel `PVR.IsRecordingPlayingChannel`\endlink replaces
8185 /// the old `Player.Recording` infolabel.
8188 /// \table_row3{ <b>`PVR.IsPlayingActiveRecording`</b>,
8189 /// \anchor PVR_IsPlayingActiveRecording
8191 /// @return **True** if PVR is currently playing an in progress recording.
8193 /// @skinning_v19 **[New Infolabel]** \link PVR_IsPlayingActiveRecording `PVR.IsPlayingActiveRecording`\endlink
8196 /// \table_row3{ <b>`PVR.TimeshiftProgressPlayPos`</b>,
8197 /// \anchor PVR_TimeshiftProgressPlayPos
8199 /// @return The percentage of the current play position within the PVR timeshift progress.
8201 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressPlayPos `PVR.TimeshiftProgressPlayPos`\endlink
8204 /// \table_row3{ <b>`PVR.TimeshiftProgressEpgStart`</b>,
8205 /// \anchor PVR_TimeshiftProgressEpgStart
8207 /// @return The percentage of the start of the currently playing epg event within the PVR timeshift progress.
8209 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgStart `PVR.TimeshiftProgressEpgStart`\endlink
8212 /// \table_row3{ <b>`PVR.TimeshiftProgressEpgEnd`</b>,
8213 /// \anchor PVR_TimeshiftProgressEpgEnd
8215 /// @return The percentage of the end of the currently playing epg event within the PVR timeshift progress.
8217 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgEnd `PVR.TimeshiftProgressEpgEnd`\endlink
8220 /// \table_row3{ <b>`PVR.TimeshiftProgressBufferStart`</b>,
8221 /// \anchor PVR_TimeshiftProgressBufferStart
8223 /// @return The percentage of the start of the timeshift buffer within the PVR timeshift progress.
8225 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferStart `PVR.TimeshiftProgressBufferStart`\endlink
8228 /// \table_row3{ <b>`PVR.TimeshiftProgressBufferEnd`</b>,
8229 /// \anchor PVR_TimeshiftProgressBufferEnd
8231 /// @return The percentage of the end of the timeshift buffer within the PVR timeshift progress.
8233 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferEnd `PVR.TimeshiftProgressBufferEnd`\endlink
8236 /// \table_row3{ <b>`PVR.EpgEventIcon`</b>,
8237 /// \anchor PVR_EpgEventIcon
8239 /// @return The icon of the currently playing epg event\, if any.
8241 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventIcon `PVR.EpgEventIcon`\endlink
8244 /// \table_row3{ <b>`PVR.ClientCount`</b>,
8245 /// \anchor PVR_ClientCount
8247 /// @return Number of PVR clients enabled.
8249 /// @skinning_v22 **[New Integer Value]** \link PVR_ClientCount `PVR.ClientCount`\endlink
8254 /// -----------------------------------------------------------------------------
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
}};
8338 /// \page modules__infolabels_boolean_conditions
8339 /// \table_row3{ <b>`PVR.EpgEventDuration`</b>,
8340 /// \anchor PVR_EpgEventDuration
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.
8346 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventDuration `PVR.EpgEventDuration`\endlink replaces
8347 /// the old `PVR.Duration` infolabel.
8350 /// \table_row3{ <b>`PVR.EpgEventDuration(format)`</b>,
8351 /// \anchor PVR_EpgEventDuration_format
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.
8358 /// \table_row3{ <b>`PVR.EpgEventElapsedTime`</b>,
8359 /// \anchor PVR_EpgEventElapsedTime
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.
8365 /// @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventElapsedTime `PVR.EpgEventElapsedTime`\endlink replaces
8366 /// the old `PVR.Time` infolabel.
8369 /// \table_row3{ <b>`PVR.EpgEventElapsedTime(format)`</b>,
8370 /// \anchor PVR_EpgEventElapsedTime_format
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.
8377 /// \table_row3{ <b>`PVR.EpgEventRemainingTime`</b>,
8378 /// \anchor PVR_EpgEventRemainingTime
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.
8384 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventRemainingTime `PVR.EpgEventRemainingTime`\endlink
8387 /// \table_row3{ <b>`PVR.EpgEventRemainingTime(format)`</b>,
8388 /// \anchor PVR_EpgEventRemainingTime_format
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.
8395 /// \table_row3{ <b>`PVR.EpgEventSeekTime`</b>,
8396 /// \anchor PVR_EpgEventSeekTime
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.
8402 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventSeekTime `PVR.EpgEventSeekTime`\endlink
8405 /// \table_row3{ <b>`PVR.EpgEventSeekTime(format)`</b>,
8406 /// \anchor PVR_EpgEventSeekTime_format
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.
8413 /// \table_row3{ <b>`PVR.EpgEventFinishTime`</b>,
8414 /// \anchor PVR_EpgEventFinishTime
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.
8420 /// @skinning_v18 **[New Infolabel]** \link PVR_EpgEventFinishTime `PVR.EpgEventFinishTime`\endlink
8423 /// \table_row3{ <b>`PVR.EpgEventFinishTime(format)`</b>,
8424 /// \anchor PVR_EpgEventFinishTime_format
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.
8431 /// \table_row3{ <b>`PVR.TimeShiftStart`</b>,
8432 /// \anchor PVR_TimeShiftStart
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.
8439 /// \table_row3{ <b>`PVR.TimeShiftStart(format)`</b>,
8440 /// \anchor PVR_TimeShiftStart_format
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.
8447 /// \table_row3{ <b>`PVR.TimeShiftEnd`</b>,
8448 /// \anchor PVR_TimeShiftEnd
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.
8455 /// \table_row3{ <b>`PVR.TimeShiftEnd(format)`</b>,
8456 /// \anchor PVR_TimeShiftEnd_format
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.
8463 /// \table_row3{ <b>`PVR.TimeShiftCur`</b>,
8464 /// \anchor PVR_TimeShiftCur
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.
8471 /// \table_row3{ <b>`PVR.TimeShiftCur(format)`</b>,
8472 /// \anchor PVR_TimeShiftCur_format
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.
8479 /// \table_row3{ <b>`PVR.TimeShiftOffset`</b>,
8480 /// \anchor PVR_TimeShiftOffset
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.
8487 /// \table_row3{ <b>`PVR.TimeShiftOffset(format)`</b>,
8488 /// \anchor PVR_TimeShiftOffset_format
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.
8495 /// \table_row3{ <b>`PVR.TimeshiftProgressDuration`</b>,
8496 /// \anchor PVR_TimeshiftProgressDuration
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.
8502 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressDuration `PVR.TimeshiftProgressDuration`\endlink
8505 /// \table_row3{ <b>`PVR.TimeshiftProgressDuration(format)`</b>,
8506 /// \anchor PVR_TimeshiftProgressDuration_format
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.
8513 /// \table_row3{ <b>`PVR.TimeshiftProgressStartTime`</b>,
8514 /// \anchor PVR_TimeshiftProgressStartTime
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.
8520 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressStartTime `PVR.TimeshiftProgressStartTime`\endlink
8523 /// \table_row3{ <b>`PVR.TimeshiftProgressStartTime(format)`</b>,
8524 /// \anchor PVR_TimeshiftProgressStartTime_format
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.
8531 /// \table_row3{ <b>`PVR.TimeshiftProgressEndTime`</b>,
8532 /// \anchor PVR_TimeshiftProgressEndTime
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.
8538 /// @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEndTime `PVR.TimeshiftProgressEndTime`\endlink
8541 /// \table_row3{ <b>`PVR.TimeshiftProgressEndTime(format)`</b>,
8542 /// \anchor PVR_TimeshiftProgressEndTime_format
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.
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.
8570 /// \table_h3{ Labels, Type, Description }
8571 /// \table_row3{ <b>`RDS.HasRds`</b>,
8572 /// \anchor RDS_HasRds
8574 /// @return **True** if RDS is present.
8576 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRds `RDS.HasRds`\endlink
8579 /// \table_row3{ <b>`RDS.HasRadioText`</b>,
8580 /// \anchor RDS_HasRadioText
8582 /// @return **True** if RDS contains also RadioText.
8584 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioText `RDS.HasRadioText`\endlink
8587 /// \table_row3{ <b>`RDS.HasRadioTextPlus`</b>,
8588 /// \anchor RDS_HasRadioTextPlus
8590 /// @return **True** if RDS with RadioText contains also the plus information.
8592 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioTextPlus `RDS.HasRadioTextPlus`\endlink
8595 /// \table_row3{ <b>`RDS.HasHotline`</b>,
8596 /// \anchor RDS_HasHotline
8598 /// @return **True** if a hotline phone number is present.
8599 /// @note Only available on RadioText Plus
8601 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasHotline `RDS.HasHotline`\endlink
8604 /// \table_row3{ <b>`RDS.HasStudio`</b>,
8605 /// \anchor RDS_HasStudio
8607 /// @return **True** if a studio name is present.
8608 /// @note Only available on RadioText Plus
8610 /// @skinning_v16 **[New Boolean Condition]** \link RDS_HasStudio `RDS.HasStudio`\endlink
8613 /// \table_row3{ <b>`RDS.AudioLanguage`</b>,
8614 /// \anchor RDS_AudioLanguage
8616 /// @return The RDS reported audio language of the channel.
8618 /// @skinning_v16 **[New Infolabel]** \link RDS_AudioLanguage `RDS.AudioLanguage`\endlink
8621 /// \table_row3{ <b>`RDS.ChannelCountry`</b>,
8622 /// \anchor RDS_ChannelCountry
8624 /// @return The country where the radio channel is broadcasted.
8626 /// @skinning_v16 **[New Infolabel]** \link RDS_ChannelCountry `RDS.ChannelCountry`\endlink
8629 /// \table_row3{ <b>`RDS.GetLine(number)`</b>,
8630 /// \anchor RDS_GetLine
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)
8636 /// @skinning_v16 **[New Infolabel]** \link RDS_GetLine `RDS.GetLine(number)`\endlink
8639 /// \table_row3{ <b>`RDS.Title`</b>,
8640 /// \anchor RDS_Title
8642 /// @return The title of item; e.g. track title of an album.
8643 /// @note Only available on RadioText Plus
8645 /// @skinning_v16 **[New Infolabel]** \link RDS_Title `RDS.Title`\endlink
8648 /// \table_row3{ <b>`RDS.Artist`</b>,
8649 /// \anchor RDS_Artist
8651 /// @return A person or band/collective generally considered responsible for the work.
8652 /// @note Only available on RadioText Plus
8654 /// @skinning_v16 **[New Infolabel]** \link RDS_Artist `RDS.Artist`\endlink
8657 /// \table_row3{ <b>`RDS.Band`</b>,
8658 /// \anchor RDS_Band
8660 /// @return The band/orchestra/musician.
8661 /// @note Only available on RadioText Plus
8663 /// @skinning_v16 **[New Infolabel]** \link RDS_Band `RDS.Band`\endlink
8666 /// \table_row3{ <b>`RDS.Composer`</b>,
8667 /// \anchor RDS_Composer
8669 /// @return The name of the original composer/author.
8670 /// @note Only available on RadioText Plus
8672 /// @skinning_v16 **[New Infolabel]** \link RDS_Composer `RDS.Composer`\endlink
8675 /// \table_row3{ <b>`RDS.Conductor`</b>,
8676 /// \anchor RDS_Conductor
8678 /// @return The artist(s) who performed the work. In classical music this would be
8680 /// @note Only available on RadioText Plus
8682 /// @skinning_v16 **[New Infolabel]** \link RDS_Conductor `RDS.Conductor`\endlink
8685 /// \table_row3{ <b>`RDS.Album`</b>,
8686 /// \anchor RDS_Album
8688 /// @return The album of the song.
8689 /// @note Only available on RadioText Plus
8691 /// @skinning_v16 **[New Infolabel]** \link RDS_Album `RDS.Album`\endlink
8694 /// \table_row3{ <b>`RDS.TrackNumber`</b>,
8695 /// \anchor RDS_TrackNumber
8697 /// @return The track number of the item on the album on which it was originally
8699 /// @note Only be available on RadioText Plus
8701 /// @skinning_v16 **[New Infolabel]** \link RDS_TrackNumber `RDS.TrackNumber`\endlink
8704 /// \table_row3{ <b>`RDS.RadioStyle`</b>,
8705 /// \anchor RDS_RadioStyle
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"...
8710 /// |:------------------------|:------------------------|
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 | |
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.
8746 /// @skinning_v16 **[New Infolabel]** \link RDS_RadioStyle `RDS.RadioStyle`\endlink
8749 /// \table_row3{ <b>`RDS.Comment`</b>,
8750 /// \anchor RDS_Comment
8752 /// @return The radio station comment string if available.
8753 /// @note Only available on RadioText Plus
8755 /// @skinning_v16 **[New Infolabel]** \link RDS_Comment `RDS.Comment`\endlink
8758 /// \table_row3{ <b>`RDS.InfoNews`</b>,
8759 /// \anchor RDS_InfoNews
8761 /// @return The message / headline (if available).
8762 /// @note Only available on RadioText Plus
8764 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoNews `RDS.InfoNews`\endlink
8767 /// \table_row3{ <b>`RDS.InfoNewsLocal`</b>,
8768 /// \anchor RDS_InfoNewsLocal
8770 /// @return The local information news sended from radio channel (if available).
8771 /// @note Only available on RadioText Plus
8773 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoNewsLocal `RDS.InfoNewsLocal`\endlink
8776 /// \table_row3{ <b>`RDS.InfoStock`</b>,
8777 /// \anchor RDS_InfoStock
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
8783 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoStock `RDS.InfoStock`\endlink
8786 /// \table_row3{ <b>`RDS.InfoStockSize`</b>,
8787 /// \anchor RDS_InfoStockSize
8789 /// @return The number of rows present in stock information.
8790 /// @note Only available on RadioText Plus
8792 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoStockSize `RDS.InfoStockSize`\endlink
8795 /// \table_row3{ <b>`RDS.InfoSport`</b>,
8796 /// \anchor RDS_InfoSport
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
8802 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoSport `RDS.InfoSport`\endlink
8805 /// \table_row3{ <b>`RDS.InfoSportSize`</b>,
8806 /// \anchor RDS_InfoSportSize
8808 /// @return The number of rows present in sport information.
8809 /// @note Only available on RadioText Plus
8811 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoSportSize `RDS.InfoSportSize`\endlink
8814 /// \table_row3{ <b>`RDS.InfoLottery`</b>,
8815 /// \anchor RDS_InfoLottery
8817 /// @return The raffle / lottery: "key word 99values" (if available).
8818 /// @note Only available on RadioText Plus
8820 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoLottery `RDS.InfoLottery`\endlink
8823 /// \table_row3{ <b>`RDS.InfoLotterySize`</b>,
8824 /// \anchor RDS_InfoLotterySize
8826 /// @return The number of rows present in lottery information.
8827 /// @note Only available on RadioText Plus
8829 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoLotterySize `RDS.InfoLotterySize`\endlink
8832 /// \table_row3{ <b>`RDS.InfoWeather`</b>,
8833 /// \anchor RDS_InfoWeather
8835 /// @return The weather information (if available).
8836 /// @note Only available on RadioText Plus
8838 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoWeather `RDS.InfoWeather`\endlink
8841 /// \table_row3{ <b>`RDS.InfoWeatherSize`</b>,
8842 /// \anchor RDS_InfoWeatherSize
8844 /// @return The number of rows present in weather information.
8845 /// @note Only available on RadioText Plus
8847 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoWeatherSize `RDS.InfoWeatherSize`\endlink
8850 /// \table_row3{ <b>`RDS.InfoCinema`</b>,
8851 /// \anchor RDS_InfoCinema
8853 /// @return The information about movies in cinema (if available).
8854 /// @note Only available on RadioText Plus
8856 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoCinema `RDS.InfoCinema`\endlink
8859 /// \table_row3{ <b>`RDS.InfoCinemaSize`</b>,
8860 /// \anchor RDS_InfoCinemaSize
8862 /// @return The number of rows present in cinema information.
8863 /// @note Only available on RadioText Plus
8865 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoCinemaSize `RDS.InfoCinemaSize`\endlink
8868 /// \table_row3{ <b>`RDS.InfoHoroscope`</b>,
8869 /// \anchor RDS_InfoHoroscope
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
8875 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscope `RDS.InfoHoroscope`\endlink
8878 /// \table_row3{ <b>`RDS.InfoHoroscopeSize`</b>,
8879 /// \anchor RDS_InfoHoroscopeSize
8881 /// @return The Number of rows present in horoscope information.
8882 /// @note Only available on RadioText Plus
8884 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscopeSize `RDS.InfoHoroscopeSize`\endlink
8887 /// \table_row3{ <b>`RDS.InfoOther`</b>,
8888 /// \anchor RDS_InfoOther
8890 /// @return Other information\, not especially specified: "key word 99info" (if available).
8891 /// @note Only available on RadioText Plus
8893 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoOther `RDS.InfoOther`\endlink
8896 /// \table_row3{ <b>`RDS.InfoOtherSize`</b>,
8897 /// \anchor RDS_InfoOtherSize
8899 /// @return The number of rows present with other information.
8900 /// @note Only available on RadioText Plus
8902 /// @skinning_v16 **[New Infolabel]** \link RDS_InfoOtherSize `RDS.InfoOtherSize`\endlink
8905 /// \table_row3{ <b>`RDS.ProgStation`</b>,
8906 /// \anchor RDS_ProgStation
8908 /// @return The name of the radio channel.
8909 /// @note becomes also set from epg if it is not available from RDS
8911 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgStation `RDS.ProgStation`\endlink
8914 /// \table_row3{ <b>`RDS.ProgNow`</b>,
8915 /// \anchor RDS_ProgNow
8917 /// @return The now playing program name.
8918 /// @note becomes also be set from epg if from RDS not available
8920 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgNow `RDS.ProgNow`\endlink
8923 /// \table_row3{ <b>`RDS.ProgNext`</b>,
8924 /// \anchor RDS_ProgNext
8926 /// @return The next played program name (if available).
8927 /// @note becomes also be set from epg if from RDS not available
8929 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgNext `RDS.ProgNext`\endlink
8932 /// \table_row3{ <b>`RDS.ProgHost`</b>,
8933 /// \anchor RDS_ProgHost
8935 /// @return The name of the host of the radio show.
8937 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgHost `RDS.ProgHost`\endlink
8940 /// \table_row3{ <b>`RDS.ProgEditStaff`</b>,
8941 /// \anchor RDS_ProgEditStaff
8943 /// @return The name of the editorial staff; e.g. name of editorial journalist.
8944 /// @note Only available on RadioText Plus
8946 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgEditStaff `RDS.ProgEditStaff`\endlink
8949 /// \table_row3{ <b>`RDS.ProgHomepage`</b>,
8950 /// \anchor RDS_ProgHomepage
8952 /// @return The Link to radio station homepage
8953 /// @note Only available on RadioText Plus
8955 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgHomepage `RDS.ProgHomepage`\endlink
8958 /// \table_row3{ <b>`RDS.ProgStyle`</b>,
8959 /// \anchor RDS_ProgStyle
8961 /// @return A human readable string about radiostyle defined from RDS or RBDS.
8963 /// @skinning_v16 **[New Infolabel]** \link RDS_ProgStyle `RDS.ProgStyle`\endlink
8966 /// \table_row3{ <b>`RDS.PhoneHotline`</b>,
8967 /// \anchor RDS_PhoneHotline
8969 /// @return The telephone number of the radio station's hotline.
8970 /// @note Only available on RadioText Plus
8972 /// @skinning_v16 **[New Infolabel]** \link RDS_PhoneHotline `RDS.PhoneHotline`\endlink
8975 /// \table_row3{ <b>`RDS.PhoneStudio`</b>,
8976 /// \anchor RDS_PhoneStudio
8978 /// @return The telephone number of the radio station's studio.
8979 /// @note Only available on RadioText Plus
8981 /// @skinning_v16 **[New Infolabel]** \link RDS_PhoneStudio `RDS.PhoneStudio`\endlink
8984 /// \table_row3{ <b>`RDS.SmsStudio`</b>,
8985 /// \anchor RDS_SmsStudio
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
8991 /// @skinning_v16 **[New Infolabel]** \link RDS_SmsStudio `RDS.SmsStudio`\endlink
8994 /// \table_row3{ <b>`RDS.EmailHotline`</b>,
8995 /// \anchor RDS_EmailHotline
8997 /// @return The email address of the radio stations hotline (if available).
8998 /// @note Only available on RadioText Plus
9000 /// @skinning_v16 **[New Infolabel]** \link RDS_EmailHotline `RDS.EmailHotline`\endlink
9003 /// \table_row3{ <b>`RDS.EmailStudio`</b>,
9004 /// \anchor RDS_EmailStudio
9006 /// @return The email address of the radio station's studio (if available).
9007 /// @note Only available on RadioText Plus
9009 /// @skinning_v16 **[New Infolabel]** \link RDS_EmailStudio `RDS.EmailStudio`\endlink
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
9064 /// \table_h3{ Labels, Type, Description }
9065 /// \table_row3{ <b>`Slideshow.IsActive`</b>,
9066 /// \anchor Slideshow_IsActive
9068 /// @return **True** if the picture slideshow is running.
9071 /// \table_row3{ <b>`Slideshow.IsPaused`</b>,
9072 /// \anchor Slideshow_IsPaused
9074 /// @return **True** if the picture slideshow is paused.
9077 /// \table_row3{ <b>`Slideshow.IsRandom`</b>,
9078 /// \anchor Slideshow_IsRandom
9080 /// @return **True** if the picture slideshow is in random mode.
9083 /// \table_row3{ <b>`Slideshow.IsVideo`</b>,
9084 /// \anchor Slideshow_IsVideo
9086 /// @return **True** if the picture slideshow is playing a video.
9088 /// @skinning_v13 **[New Boolean Condition]** \link Slideshow_IsVideo `Slideshow.IsVideo`\endlink
9091 /// \table_row3{ <b>`Slideshow.Altitude`</b>,
9092 /// \anchor Slideshow_Altitude
9094 /// @return The altitude in meters where the current picture was taken.
9095 /// @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
9098 /// \table_row3{ <b>`Slideshow.Aperture`</b>,
9099 /// \anchor Slideshow_Aperture
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).
9105 /// \table_row3{ <b>`Slideshow.Author`</b>,
9106 /// \anchor Slideshow_Author
9108 /// @return The name of the person involved in writing about the current
9110 /// @note This is the value of the IPTC Writer tag (hex code 0x7A).
9112 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Author `Slideshow.Author`\endlink
9115 /// \table_row3{ <b>`Slideshow.Byline`</b>,
9116 /// \anchor Slideshow_Byline
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).
9121 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Byline `Slideshow.Byline`\endlink
9124 /// \table_row3{ <b>`Slideshow.BylineTitle`</b>,
9125 /// \anchor Slideshow_BylineTitle
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).
9130 /// @skinning_v13 **[New Infolabel]** \link Slideshow_BylineTitle `Slideshow.BylineTitle`\endlink
9133 /// \table_row3{ <b>`Slideshow.CameraMake`</b>,
9134 /// \anchor Slideshow_CameraMake
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).
9140 /// \table_row3{ <b>`Slideshow.CameraModel`</b>,
9141 /// \anchor Slideshow_CameraModel
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).
9148 /// \table_row3{ <b>`Slideshow.Caption`</b>,
9149 /// \anchor Slideshow_Caption
9151 /// @return A description of the current picture.
9152 /// @note This is the value of the IPTC Caption tag (hex code 0x78).
9155 /// \table_row3{ <b>`Slideshow.Category`</b>,
9156 /// \anchor Slideshow_Category
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).
9161 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Category `Slideshow.Category`\endlink
9164 /// \table_row3{ <b>`Slideshow.CCDWidth`</b>,
9165 /// \anchor Slideshow_CCDWidth
9167 /// @return The width of the CCD in the camera used to take the current
9169 /// @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
9171 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CCDWidth `Slideshow.CCDWidth`\endlink
9174 /// \table_row3{ <b>`Slideshow.City`</b>,
9175 /// \anchor Slideshow_City
9177 /// @return The city where the current picture was taken.
9178 /// @note This is the value of the IPTC City tag (hex code 0x5A).
9180 /// @skinning_v13 **[New Infolabel]** \link Slideshow_City `Slideshow.City`\endlink
9183 /// \table_row3{ <b>`Slideshow.Colour`</b>,
9184 /// \anchor Slideshow_Colour
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>
9190 /// @deprecated Slideshow_Colour `Slideshow.Colour`\endlink is deprecated and will be removed in future Kodi versions
9192 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Colour `Slideshow.Colour`\endlink
9195 /// \table_row3{ <b>`Slideshow.CopyrightNotice`</b>,
9196 /// \anchor Slideshow_CopyrightNotice
9198 /// @return The copyright notice of the current picture.
9199 /// @note This is the value of the IPTC Copyright tag (hex code 0x74).
9201 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CopyrightNotice `Slideshow.CopyrightNotice`\endlink
9204 /// \table_row3{ <b>`Slideshow.Country`</b>,
9205 /// \anchor Slideshow_Country
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).
9210 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Country `Slideshow.Country`\endlink
9213 /// \table_row3{ <b>`Slideshow.CountryCode`</b>,
9214 /// \anchor Slideshow_CountryCode
9216 /// @return The country code of the country where the current picture was
9218 /// @note This is the value of the IPTC CountryCode tag (hex code 0x64).
9220 /// @skinning_v13 **[New Infolabel]** \link Slideshow_CountryCode `Slideshow.CountryCode`\endlink
9223 /// \table_row3{ <b>`Slideshow.Credit`</b>,
9224 /// \anchor Slideshow_Credit
9226 /// @return Who provided the current picture.
9227 /// @note This is the value of the IPTC Credit tag (hex code 0x6E).
9229 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Credit `Slideshow.Credit`\endlink
9232 /// \table_row3{ <b>`Slideshow.DigitalZoom`</b>,
9233 /// \anchor Slideshow_DigitalZoom
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).
9238 /// @skinning_v13 **[New Infolabel]** \link Slideshow_DigitalZoom `Slideshow.DigitalZoom`\endlink
9241 /// \table_row3{ <b>`Slideshow.EXIFComment`</b>,
9242 /// \anchor Slideshow_EXIFComment
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".
9249 /// \table_row3{ <b>`Slideshow.EXIFDate`</b>,
9250 /// \anchor Slideshow_EXIFDate
9252 /// @return The localized date of the current picture. The short form of the
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.
9259 /// @skinning_v13 **[New Infolabel]** \link Slideshow_EXIFDate `Slideshow.EXIFDate`\endlink
9262 /// \table_row3{ <b>`Slideshow.EXIFDescription`</b>,
9263 /// \anchor Slideshow_EXIFDescription
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).
9270 /// \table_row3{ <b>`Slideshow.EXIFSoftware`</b>,
9271 /// \anchor Slideshow_EXIFSoftware
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).
9278 /// \table_row3{ <b>`Slideshow.EXIFTime`</b>,
9279 /// \anchor Slideshow_EXIFTime
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)
9289 /// \table_row3{ <b>`Slideshow.Exposure`</b>,
9290 /// \anchor Slideshow_Exposure
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>
9299 /// @note This is the value of the EXIF ExposureProgram tag
9300 /// (hex code 0x8822).
9302 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Exposure `Slideshow.Exposure`\endlink
9305 /// \table_row3{ <b>`Slideshow.ExposureBias`</b>,
9306 /// \anchor Slideshow_ExposureBias
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).
9312 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ExposureBias `Slideshow.ExposureBias`\endlink
9315 /// \table_row3{ <b>`Slideshow.ExposureMode`</b>,
9316 /// \anchor Slideshow_ExposureMode
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).
9325 /// \table_row3{ <b>`Slideshow.ExposureTime`</b>,
9326 /// \anchor Slideshow_ExposureTime
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.
9334 /// \table_row3{ <b>`Slideshow.Filedate`</b>,
9335 /// \anchor Slideshow_Filedate
9337 /// @return The file date of the current picture.
9340 /// \table_row3{ <b>`Slideshow.Filename`</b>,
9341 /// \anchor Slideshow_Filename
9343 /// @return The file name of the current picture.
9346 /// \table_row3{ <b>`Slideshow.Filesize`</b>,
9347 /// \anchor Slideshow_Filesize
9349 /// @return The file size of the current picture.
9352 /// \table_row3{ <b>`Slideshow.FlashUsed`</b>,
9353 /// \anchor Slideshow_FlashUsed
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).
9359 /// @skinning_v13 **[New Infolabel]** \link Slideshow_FlashUsed `Slideshow.FlashUsed`\endlink
9362 /// \table_row3{ <b>`Slideshow.FocalLength`</b>,
9363 /// \anchor Slideshow_FocalLength
9365 /// @return The focal length of the lens\, in mm.
9366 /// @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
9369 /// \table_row3{ <b>`Slideshow.FocusDistance`</b>,
9370 /// \anchor Slideshow_FocusDistance
9372 /// @return The distance to the subject\, in meters.
9373 /// @note This is the value of the EXIF SubjectDistance tag (hex code 0x9206).
9376 /// \table_row3{ <b>`Slideshow.Headline`</b>,
9377 /// \anchor Slideshow_Headline
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).
9382 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Headline `Slideshow.Headline`\endlink
9385 /// \table_row3{ <b>`Slideshow.ImageType`</b>,
9386 /// \anchor Slideshow_ImageType
9388 /// @return The color components of the current picture.
9389 /// @note This is the value of the IPTC ImageType tag (hex code 0x82).
9391 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ImageType `Slideshow.ImageType`\endlink
9394 /// \table_row3{ <b>`Slideshow.IPTCDate`</b>,
9395 /// \anchor Slideshow_IPTCDate
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).
9402 /// \table_row3{ <b>`Slideshow.ISOEquivalence`</b>,
9403 /// \anchor Slideshow_ISOEquivalence
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).
9409 /// \table_row3{ <b>`Slideshow.Keywords`</b>,
9410 /// \anchor Slideshow_Keywords
9412 /// @return The keywords assigned to the current picture.
9413 /// @note This is the value of the IPTC Keywords tag (hex code 0x19).
9416 /// \table_row3{ <b>`Slideshow.Latitude`</b>,
9417 /// \anchor Slideshow_Latitude
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.
9425 /// \table_row3{ <b>`Slideshow.LightSource`</b>,
9426 /// \anchor Slideshow_LightSource
9428 /// @return The kind of light source when the picture was taken. Possible
9430 /// - <b>"Daylight"</b>
9431 /// - <b>"Fluorescent"</b>
9432 /// - <b>"Incandescent"</b>
9434 /// @note This is the value of the EXIF LightSource tag (hex code 0x9208).
9436 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LightSource `Slideshow.LightSource`\endlink
9439 /// \table_row3{ <b>`Slideshow.LongEXIFDate`</b>,
9440 /// \anchor Slideshow_LongEXIFDate
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.
9449 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFDate `Slideshow.LongEXIFDate`\endlink
9452 /// \table_row3{ <b>`Slideshow.LongEXIFTime`</b>,
9453 /// \anchor Slideshow_LongEXIFTime
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.
9462 /// @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFTime `Slideshow.LongEXIFTime`\endlink
9465 /// \table_row3{ <b>`Slideshow.Longitude`</b>,
9466 /// \anchor Slideshow_Longitude
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.
9474 /// \table_row3{ <b>`Slideshow.MeteringMode`</b>,
9475 /// \anchor Slideshow_MeteringMode
9477 /// @return The metering mode used when the current picture was taken. The
9478 /// possible values are:
9479 /// - <b>"Center weight"</b>
9481 /// - <b>"Matrix"</b>
9482 /// @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
9484 /// @skinning_v13 **[New Infolabel]** \link Slideshow_MeteringMode `Slideshow.MeteringMode`\endlink
9487 /// \table_row3{ <b>`Slideshow.ObjectName`</b>,
9488 /// \anchor Slideshow_ObjectName
9490 /// @return a shorthand reference for the current picture.
9491 /// @note This is the value of the IPTC ObjectName tag (hex code 0x05).
9493 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ObjectName `Slideshow.ObjectName`\endlink
9496 /// \table_row3{ <b>`Slideshow.Orientation`</b>,
9497 /// \anchor Slideshow_Orientation
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>
9505 /// @note This is the value of the EXIF Orientation tag (hex code 0x0112).
9507 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Orientation `Slideshow.Orientation`\endlink
9510 /// \table_row3{ <b>`Slideshow.Path`</b>,
9511 /// \anchor Slideshow_Path
9513 /// @return The file path of the current picture.
9516 /// \table_row3{ <b>`Slideshow.Process`</b>,
9517 /// \anchor Slideshow_Process
9519 /// @return The process used to compress the current picture.
9521 /// @deprecated \link Slideshow_Process `Slideshow.Process`\endlink is deprecated and will be removed in future Kodi versions
9523 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Process `Slideshow.Process`\endlink
9526 /// \table_row3{ <b>`Slideshow.ReferenceService`</b>,
9527 /// \anchor Slideshow_ReferenceService
9529 /// @return The Service Identifier of a prior envelope to which the current
9531 /// @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
9533 /// @skinning_v13 **[New Infolabel]** \link Slideshow_ReferenceService `Slideshow.ReferenceService`\endlink
9536 /// \table_row3{ <b>`Slideshow.Resolution`</b>,
9537 /// \anchor Slideshow_Resolution
9539 /// @return The dimensions of the current picture (Width x Height)
9542 /// \table_row3{ <b>`Slideshow.SlideComment`</b>,
9543 /// \anchor Slideshow_SlideComment
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".
9550 /// \table_row3{ <b>`Slideshow.SlideIndex`</b>,
9551 /// \anchor Slideshow_SlideIndex
9553 /// @return The slide index of the current picture.
9556 /// \table_row3{ <b>`Slideshow.Source`</b>,
9557 /// \anchor Slideshow_Source
9559 /// @return The original owner of the current picture.
9560 /// @note This is the value of the IPTC Source tag (hex code 0x73).
9562 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Source `Slideshow.Source`\endlink
9565 /// \table_row3{ <b>`Slideshow.SpecialInstructions`</b>,
9566 /// \anchor Slideshow_SpecialInstructions
9568 /// @return Other editorial instructions concerning the use of the current
9570 /// @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
9572 /// @skinning_v13 **[New Infolabel]** \link Slideshow_SpecialInstructions `Slideshow.SpecialInstructions`\endlink
9575 /// \table_row3{ <b>`Slideshow.State`</b>,
9576 /// \anchor Slideshow_State
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).
9581 /// @skinning_v13 **[New Infolabel]** \link Slideshow_State `Slideshow.State`\endlink
9584 /// \table_row3{ <b>`Slideshow.Sublocation`</b>,
9585 /// \anchor Slideshow_Sublocation
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).
9591 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Sublocation `Slideshow.Sublocation`\endlink
9594 /// \table_row3{ <b>`Slideshow.SupplementalCategories`</b>,
9595 /// \anchor Slideshow_SupplementalCategories
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
9602 /// @skinning_v13 **[New Infolabel]** \link Slideshow_SupplementalCategories `Slideshow.SupplementalCategories`\endlink
9605 /// \table_row3{ <b>`Slideshow.TimeCreated`</b>,
9606 /// \anchor Slideshow_TimeCreated
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).
9612 /// @skinning_v13 **[New Infolabel]** \link Slideshow_TimeCreated `Slideshow.TimeCreated`\endlink
9615 /// \table_row3{ <b>`Slideshow.TransmissionReference`</b>,
9616 /// \anchor Slideshow_TransmissionReference
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).
9623 /// @skinning_v13 **[New Infolabel]** \link Slideshow_TransmissionReference `Slideshow.TransmissionReference`\endlink
9626 /// \table_row3{ <b>`Slideshow.Urgency`</b>,
9627 /// \anchor Slideshow_Urgency
9629 /// @return The urgency of the current picture. Values are 1-9. The 1 is most
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).
9636 /// @skinning_v13 **[New Infolabel]** \link Slideshow_Urgency `Slideshow.Urgency`\endlink
9639 /// \table_row3{ <b>`Slideshow.WhiteBalance`</b>,
9640 /// \anchor Slideshow_WhiteBalance
9642 /// @return The white balance mode set when the current picture was taken.
9643 /// The possible values are:
9644 /// - <b>"Manual"</b>
9647 /// @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
9649 /// @skinning_v13 **[New Infolabel]** \link Slideshow_WhiteBalance `Slideshow.WhiteBalance`\endlink
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
9725 /// \table_h3{ Labels, Type, Description }
9726 /// \table_row3{ <b>`Library.IsScanning`</b>,
9727 /// \anchor Library_IsScanning
9729 /// @return **True** if the library is being scanned.
9732 /// \table_row3{ <b>`Library.IsScanningVideo`</b>,
9733 /// \anchor Library_IsScanningVideo
9735 /// @return **True** if the video library is being scanned.
9738 /// \table_row3{ <b>`Library.IsScanningMusic`</b>,
9739 /// \anchor Library_IsScanningMusic
9741 /// @return **True** if the music library is being scanned.
9744 /// \table_row3{ <b>`Library.HasContent(music)`</b>,
9745 /// \anchor Library_HasContent_Music
9747 /// @return **True** if the library has music content.
9750 /// \table_row3{ <b>`Library.HasContent(video)`</b>,
9751 /// \anchor Library_HasContent_Video
9753 /// @return **True** if the library has video content.
9756 /// \table_row3{ <b>`Library.HasContent(movies)`</b>,
9757 /// \anchor Library_HasContent_Movies
9759 /// @return **True** if the library has movies.
9762 /// \table_row3{ <b>`Library.HasContent(tvshows)`</b>,
9763 /// \anchor Library_HasContent_TVShows
9765 /// @return **True** if the library has tvshows.
9768 /// \table_row3{ <b>`Library.HasContent(musicvideos)`</b>,
9769 /// \anchor Library_HasContent_MusicVideos
9771 /// @return **True** if the library has music videos.
9774 /// \table_row3{ <b>`Library.HasContent(moviesets)`</b>,
9775 /// \anchor Library_HasContent_MovieSets
9777 /// @return **True** if the library has movie sets.
9780 /// \table_row3{ <b>`Library.HasContent(singles)`</b>,
9781 /// \anchor Library_HasContent_Singles
9783 /// @return **True** if the library has singles.
9786 /// \table_row3{ <b>`Library.HasContent(compilations)`</b>,
9787 /// \anchor Library_HasContent_Compilations
9789 /// @return **True** if the library has compilations.
9792 /// \table_row3{ <b>`Library.HasContent(Role.Composer)`</b>,
9793 /// \anchor Library_HasContent_Role_Composer
9795 /// @return **True** if there are songs in the library which have composers.
9797 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Composer `Library.HasContent(Role.Composer)`\endlink
9800 /// \table_row3{ <b>`Library.HasContent(Role.Conductor)`</b>,
9801 /// \anchor Library_HasContent_Role_Conductor
9803 /// @return **True** if there are songs in the library which have a conductor.
9805 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Conductor `Library.HasContent(Role.Conductor)`\endlink
9808 /// \table_row3{ <b>`Library.HasContent(Role.Orchestra)`</b>,
9809 /// \anchor Library_HasContent_Role_Orchestra
9811 /// @return **True** if there are songs in the library which have an orchestra.
9813 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Orchestra `Library.HasContent(Role.Orchestra)`\endlink
9816 /// \table_row3{ <b>`Library.HasContent(Role.Lyricist)`</b>,
9817 /// \anchor Library_HasContent_Role_Lyricist
9819 /// @return **True** if there are songs in the library which have a lyricist.
9821 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Lyricist `Library.HasContent(Role.Lyricist)`\endlink
9824 /// \table_row3{ <b>`Library.HasContent(Role.Remixer)`</b>,
9825 /// \anchor Library_HasContent_Role_Remixer
9827 /// @return **True** if there are songs in the library which have a remixer.
9829 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Remixer)`\endlink
9832 /// \table_row3{ <b>`Library.HasContent(Role.Arranger)`</b>,
9833 /// \anchor Library_HasContent_Role_Remixer
9835 /// @return **True** if there are songs in the library which have an arranger.
9837 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Arranger)`\endlink
9840 /// \table_row3{ <b>`Library.HasContent(Role.Engineer)`</b>,
9841 /// \anchor Library_HasContent_Role_Engineer
9843 /// @return **True** if there are songs in the library which have an engineer.
9845 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Engineer `Library.HasContent(Role.Engineer)`\endlink
9848 /// \table_row3{ <b>`Library.HasContent(Role.Producer)`</b>,
9849 /// \anchor Library_HasContent_Role_Producer
9851 /// @return **True** if there are songs in the library which have an producer.
9853 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Producer `Library.HasContent(Role.Producer)`\endlink
9856 /// \table_row3{ <b>`Library.HasContent(Role.DJMixer)`</b>,
9857 /// \anchor Library_HasContent_Role_DJMixer
9859 /// @return **True** if there are songs in the library which have a DJMixer.
9861 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_DJMixer `Library.HasContent(Role.DJMixer)`\endlink
9864 /// \table_row3{ <b>`Library.HasContent(Role.Mixer)`</b>,
9865 /// \anchor Library_HasContent_Role_Mixer
9867 /// @return **True** if there are songs in the library which have a mixer.
9869 /// @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Mixer `Library.HasContent(Role.Mixer)`\endlink
9872 /// \table_row3{ <b>`Library.HasContent(boxsets)`</b>,
9873 /// \anchor Library_HasContent_Boxsets
9875 /// @return **True** if there are albums in the library which are boxsets.
9877 /// @skinning_v19 **[New Boolean Condition]** \link Library_HasContent_Boxsets `Library.HasContent(boxsets)`\endlink
9880 /// \table_row3{ <b>`Library.HasNode(path)`</b>,
9881 /// \anchor Library_HasNode
9883 /// @return **True** if there the node is present in the library.
9885 /// @skinning_v19 **[New Boolean Condition]** \link Library_HasNode `Library.HasNode(path)`\endlink
9890 /// -----------------------------------------------------------------------------
9892 /// \page modules__infolabels_boolean_conditions
9893 /// \section modules_rm_infolabels_booleans Additional revision history for Infolabels and Boolean Conditions
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
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)
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
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
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`
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)`
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`
9983 /// \subsection modules_rm_infolabels_booleans_v15 Kodi v15 (Isengard)
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`
9992 /// \subsection modules_rm_infolabels_booleans_v13 XBMC v13 (Gotham)
9993 /// @skinning_v13 **[Removed Infolabels]** The following infolabels were removed:
9994 /// - `Network.SubnetAddress`
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
¶meters
)
10004 CUtil::SplitParams(parameters
, params
);
10007 const std::string
&CGUIInfoManager::Property::param(unsigned int n
/* = 0 */) const
10009 if (n
< params
.size())
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
;
10027 for (size_t i
= 0; i
< infoString
.size(); ++i
)
10029 if (infoString
[i
] == '(')
10031 if (!parentheses
++)
10034 else if (infoString
[i
] == ')')
10037 CLog::Log(LOGERROR
, "unmatched parentheses in {}", infoString
);
10038 else if (!--parentheses
)
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
);
10053 param
+= infoString
[i
];
10055 property
+= infoString
[i
];
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
);
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
);
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")
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
);
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
)
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
)
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
¶m
= 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
);
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
);
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
);
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));
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
));
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
)
10423 else if (cat
.name
== "slideshow")
10425 for (const infomap
& i
: slideshow
)
10427 if (prop
.name
== i
.str
)
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
)
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);
10471 listItemDependent
= true;
10474 else if (cat
.name
== "visualisation")
10476 for (const infomap
& i
: visualisation
)
10478 if (prop
.name
== i
.str
)
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)));
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());
10548 return AddMultiInfo(CGUIInfo(control_label
.val
, controlID
, 0));
10553 else if (cat
.name
== "controlgroup" && prop
.name
== "hasfocus")
10555 int groupID
= atoi(cat
.param().c_str());
10557 return AddMultiInfo(CGUIInfo(CONTROL_GROUP_HAS_FOCUS
, groupID
, atoi(prop
.param(0).c_str())));
10559 else if (cat
.name
== "playlist")
10562 for (const infomap
& i
: playlist
)
10564 if (prop
.name
== i
.str
)
10572 if (prop
.num_params() <= 0)
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
)
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
)
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);
10696 listItemDependent
= true;
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());
10709 return AddMultiInfo(CGUIInfo(control_label
.val
, controlID
, atoi(info
[2].param(0).c_str())));
10719 int CGUIInfoManager::TranslateListItem(const Property
& cat
, const Property
& prop
, int id
, bool container
)
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
;
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());
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
;
10761 int offset
= std::atoi(cat
.param().c_str());
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
;
10774 flags
|= INFOFLAG_LISTITEM_CONTAINER
;
10776 return AddMultiInfo(CGUIInfo(ret
, id
, offset
, flags
, data3
, data4
));
10782 int CGUIInfoManager::TranslateMusicPlayerString(const std::string
&info
) const
10784 for (const infomap
& i
: musicplayer
)
10792 int CGUIInfoManager::TranslateVideoPlayerString(const std::string
& info
) const
10794 for (const infomap
& i
: videoplayer
)
10802 int CGUIInfoManager::TranslatePlayerString(const std::string
& info
) const
10804 for (const infomap
& i
: player_labels
)
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
);
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
;
10882 itemPtr
= GUIINFO::GetCurrentListItem(contextWindow
);
10883 item
= itemPtr
.get();
10885 return GetItemInt(value
, item
, contextWindow
, info
);
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
));
10906 res
= m_bools
.insert(std::make_shared
<InfoSingle
>(condition
, context
, m_refreshCounter
));
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
);
10926 return info
->Get(contextWindow
, item
.get());
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
;
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
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
;
10969 itemPtr
= GUIINFO::GetCurrentListItem(contextWindow
, info
.GetData1(), info
.GetData2(), info
.GetInfoFlag());
10970 item
= itemPtr
.get();
10974 if (condition
== LISTITEM_PROPERTY
)
10976 if (item
->HasProperty(info
.GetData3()))
10977 bReturn
= item
->GetProperty(info
.GetData3()).asBoolean();
10980 bReturn
= GetItemBool(item
, contextWindow
, condition
);
10987 else if (!m_infoProviders
.GetBool(bReturn
, m_currentFile
, contextWindow
, info
))
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();
10996 bReturn
= GetImage(info
.GetData1(), contextWindow
).empty();
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
);
11025 compare
= GetImage(info2
, contextWindow
);
11027 else if (!info
.GetData3().empty())
11028 { // conditional string
11029 compare
= info
.GetData3();
11031 StringUtils::ToLower(compare
);
11034 if (item
&& item
->IsFileItem() && IsListItemInfo(info
.GetData1()))
11035 label
= GetItemImage(item
, contextWindow
, info
.GetData1());
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
;
11047 bReturn
= StringUtils::EqualsNoCase(label
, compare
);
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
:
11058 auto getIntValue
= [this, &item
, &contextWindow
](int infoNum
) {
11060 if (!GetInt(intValue
, infoNum
, contextWindow
, item
))
11063 if (item
&& item
->IsFileItem() && IsListItemInfo(infoNum
))
11064 value
= GetItemImage(item
, contextWindow
, infoNum
);
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
);
11073 std::from_chars(value
.data(), value
.data() + value
.size(), intValue
);
11078 int leftIntValue
= getIntValue(info
.GetData1());
11079 int rightIntValue
= getIntValue(info
.GetData2());
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;
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();
11110 else if (info
.m_info
>= LISTITEM_START
&& info
.m_info
<= LISTITEM_END
)
11112 std::shared_ptr
<CGUIListItem
> itemPtr
;
11115 itemPtr
= GUIINFO::GetCurrentListItem(contextWindow
, info
.GetData1(), info
.GetData2(), info
.GetInfoFlag());
11116 item
= itemPtr
.get();
11120 if (info
.m_info
== LISTITEM_PROPERTY
)
11122 if (item
->HasProperty(info
.GetData3()))
11124 value
= item
->GetProperty(info
.GetData3()).asInteger();
11130 return GetItemInt(value
, item
, contextWindow
, info
.m_info
);
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());
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
);
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
);
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
);
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
11243 INFOBOOLTYPE
swapList(&InfoBoolComparator
);
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__
);
11291 int CGUIInfoManager::ResolveMultiInfo(int info
) const
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
;
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
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
11332 return std::string();
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
);
11370 case LISTITEM_DATE
:
11371 if (item
->m_dateTime
.IsValid())
11372 return item
->m_dateTime
.GetAsLocalizedDate();
11374 case LISTITEM_DATETIME
:
11375 if (item
->m_dateTime
.IsValid())
11376 return item
->m_dateTime
.GetAsLocalizedDateTime();
11378 case LISTITEM_SIZE
:
11379 if (!item
->m_bIsFolder
|| item
->m_dwSize
)
11380 return StringUtils::SizeToString(item
->m_dwSize
);
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");
11392 *fallback
= item
->GetArt("icon");
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
:
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
);
11416 case LISTITEM_FILENAME_AND_PATH
:
11418 std::string path
= item
->GetPath();
11419 path
= CURL(path
).GetWithoutUserDetails();
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
);
11430 case LISTITEM_STARTTIME
:
11432 if (item
->m_dateTime
.IsValid())
11433 return item
->m_dateTime
.GetAsLocalizedTime("", false);
11436 case LISTITEM_STARTDATE
:
11438 if (item
->m_dateTime
.IsValid())
11439 return item
->m_dateTime
.GetAsLocalizedDate(true);
11442 case LISTITEM_CURRENTITEM
:
11443 return std::to_string(item
->GetCurrentItem());
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
11477 bool value
= false;
11478 if (!m_infoProviders
.GetBool(value
, item
, contextWindow
, CGUIInfo(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();
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();
11528 const CVideoInfoTag
* CGUIInfoManager::GetCurrentMovieTag() const
11530 if (m_currentFile
->HasVideoInfoTag())
11531 return m_currentFile
->GetVideoInfoTag();
11536 const KODI::GAME::CGameInfoTag
* CGUIInfoManager::GetCurrentGameTag() const
11538 if (m_currentFile
->HasGameInfoTag())
11539 return m_currentFile
->GetGameInfoTag();
11544 int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString
* info
)
11549 std::unique_lock
<CCriticalSection
> lock(m_critInfo
);
11550 m_skinVariableStrings
.emplace_back(*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
;
11566 std::string
CGUIInfoManager::GetSkinVariableString(int info
,
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
);
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
)
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
:
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
));
11608 case TMSG_GUI_INFOBOOL
:
11612 auto infoLabels
= static_cast<std::vector
<bool>*>(pMsg
->lpVoid
);
11613 for (auto& param
: pMsg
->params
)
11614 infoLabels
->push_back(EvaluateBool(param
, DEFAULT_CONTEXT
));
11619 case TMSG_UPDATE_CURRENT_ITEM
:
11621 CFileItem
* item
= static_cast<CFileItem
*>(pMsg
->lpVoid
);
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());
11630 SetCurrentItem(*item
);
11641 void CGUIInfoManager::RegisterInfoProvider(IGUIInfoProvider
*provider
)
11643 if (!CServiceBroker::GetWinSystem())
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())
11656 std::unique_lock
<CCriticalSection
> lock(CServiceBroker::GetWinSystem()->GetGfxContext());
11658 m_infoProviders
.UnregisterProvider(provider
);