{"id":641,"date":"2018-09-27T22:34:03","date_gmt":"2018-09-27T21:34:03","guid":{"rendered":"http:\/\/www.bulis.co.uk\/?page_id=641"},"modified":"2018-10-29T16:12:39","modified_gmt":"2018-10-29T16:12:39","slug":"kodi-tuorial-create-music-addon","status":"publish","type":"page","link":"http:\/\/www.bulis.co.uk\/?page_id=641","title":{"rendered":"Kodi Tutorial: Create Music Addon"},"content":{"rendered":"<p>This tutorial will describe how to create a music addon for the popular Kodi media center. The addon we will be creating will recieve streams from the radio station <a href=\"https:\/\/absoluteradio.co.uk\/\">Absolute Radio.<\/a> Absolute Radio is one of the UK&#8217;s Independent National Radio stations. The station is based in London and plays popular rock music broadcasting on medium wave and DAB across the UK (105.8 FM in London and 105.2 FM in the West Midlands). It is also available in other parts of the world via satellite, cable, and on the Internet.<\/p>\n<p>Absolute Radio conveniently offers the following links to their <a href=\"https:\/\/absoluteradio.co.uk\/listen\/links\/\">audio streams.<\/a><\/p>\n<p>This addon will use these links to stream content from the following stations:<\/p>\n<ul>\n<li><a href=\"http:\/\/mp3-ar-32.timlradio.co.uk\/\">Absolute Radio<\/a><\/li>\n<li><a href=\"http:\/\/mp3-ac-32.timlradio.co.uk\/\">Absolute Radio Classic Rock<\/a><\/li>\n<li><a href=\"http:\/\/mp3-a6-32.timlradio.co.uk\/\">Absolute Radio 60&#8217;s<\/a><\/li>\n<li><a href=\"http:\/\/mp3-a7-32.timlradio.co.uk\/\">Absolute Radio 70&#8217;s<\/a><\/li>\n<li><a href=\"http:\/\/mp3-a8-32.timlradio.co.uk\/\">Absolute Radio 80&#8217;s<\/a><\/li>\n<li><a href=\"http:\/\/mp3-a9-32.timlradio.co.uk\/\">Absolute Radio 90&#8217;s<\/a><\/li>\n<li><a href=\"http:\/\/mp3-a0-32.timlradio.co.uk\/\">Absolute\u00a0 Radio 00&#8217;s<\/a><\/li>\n<\/ul>\n<p>To add a bit of eye candy this addon will monitor the content of the stream searching for the current artist and display an image in the background when found. We will also allow the option for showing a detailed description of the current artist.<\/p>\n<p>There will be a page for changing the default settings like the type and quality of the stream and the option to disable searching for artist information.<\/p>\n<p>When creating addons for Kodi one of the most useful resources at your disposal is Kodi&#8217;s <a href=\"https:\/\/kodi.wiki\/view\/Add-on_development\">Add-0n Developement page<\/a><\/p>\n<h2>Let&#8217;s Begin \ud83d\ude42<\/h2>\n<p>We need to achieve the following tasks:<\/p>\n<ul>\n<li><a href=\"#create-folders\">Create Folders<\/a><\/li>\n<li><a href=\"#language-settings\">Language Settings<\/a><\/li>\n<li><a href=\"#artist-information\">Artist Information Module<\/a><\/li>\n<li><a href=\"#images\">Images<\/a><\/li>\n<li><a href=\"#skins\">Skins<\/a><\/li>\n<li><a href=\"#settings\">Settings<\/a><\/li>\n<li><a href=\"#icon-and-fanart\">Icon &amp; Fanart<\/a><\/li>\n<li><a href=\"#addon-details\">Addon Details<\/a><\/li>\n<li><a href=\"#addon-code\">Addon Code<\/a><\/li>\n<li><a href=\"#activate-addon\">Activate Addon<\/a><\/li>\n<\/ul>\n<div id=\"create-folders\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Create Folders<\/h3>\n<p>We first need to create a subfolder within the <strong>.kodi\\addons<\/strong> folder. The name of this folder will be <strong>plugin.audio.absolute-radio<\/strong>. This is where we will write the code. Next we need to create a subfolder within this folder called <strong>resources<\/strong>. This folder will contain the icon and fanart images along with the default settings. Within the <strong>resources<\/strong> folder we will need to create four further folders named <strong>language<\/strong>, <strong>lib<\/strong>,\u00a0<strong>media<\/strong> and <strong>skin<\/strong>. These will contain language options, extra code modules used by the addon, icons and fanart for menu options. The skin folder will contain two custom layouts for displaying the artist image and description screens.<\/p>\n<div id=\"language-settings\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Language Settings<\/h3>\n<p>We now have only one more folder to create. The folder for the language settings so open the <strong>language<\/strong> folder and create a subfolder called <strong>resource.language.en_gb<\/strong>. This is where we will store all the text settings used by our addon in the english language along with a unique number. We will refer to this number within the addon whenever we need to use that text so we can translate the text into another language.<\/p>\n<p>Create a file called <strong>strings.po<\/strong> and insert the following:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# Kodi Media Center language file\r\n# Addon Name: Absolute Radio\r\n# Addon id: plugin.audio.absolute-radio\r\n# Addon Provider: Phantom Raspberry Blower\r\nmsgid &quot;&quot;\r\nmsgstr &quot;&quot;\r\n&quot;Project-Id-Version: Kodi Addons\\n&quot;\r\n&quot;Report-Msgid-Bugs-To: alanwww1@kodi.org\\n&quot;\r\n&quot;POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\\n&quot;\r\n&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n&quot;\r\n&quot;Last-Translator: Kodi Translation Team\\n&quot;\r\n&quot;Language-Team: English (http:\/\/www.transifex.com\/projects\/p\/xbmc-addons\/language\/en\/)\\n&quot;\r\n&quot;MIME-Version: 1.0\\n&quot;\r\n&quot;Content-Type: text\/plain; charset=UTF-8\\n&quot;\r\n&quot;Content-Transfer-Encoding: 8bit\\n&quot;\r\n&quot;Language: en\\n&quot;\r\n&quot;Plural-Forms: nplurals=2; plural=(n != 1);\\n&quot;\r\n\r\n# General settings\r\nmsgctxt &quot;#30001&quot;\r\nmsgid &quot;General&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30002&quot;\r\nmsgid &quot;Sound Quality&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30003&quot;\r\nmsgid &quot;Hide Artist Fanart&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30004&quot;\r\nmsgid &quot;Compression Format&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30005&quot;\r\nmsgid &quot;Bitrate&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30006&quot;\r\nmsgid &quot;Account Details&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30007&quot;\r\nmsgid &quot;Username&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30008&quot;\r\nmsgid &quot;Password&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30009&quot;\r\nmsgid &quot;Hide Artist Information&quot;\r\nmsgstr &quot;&quot;\r\n\r\n# Language strings\r\n\r\nmsgctxt &quot;#30101&quot;\r\nmsgid &quot;Absolute Radio&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30102&quot;\r\nmsgid &quot;Status&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30103&quot;\r\nmsgid &quot;Unplayable stream&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30104&quot;\r\nmsgid &quot;Something wicked happened :(&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30105&quot;\r\nmsgid &quot;Error!&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30106&quot;\r\nmsgid &quot;Please wait...&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30107&quot;\r\nmsgid &quot;Process Complete&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30108&quot;\r\nmsgid &quot;Failed to download audio links&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30109&quot;\r\nmsgid &quot;Logged into Absolute Radio.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30110&quot;\r\nmsgid &quot;Login Success :)&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30111&quot;\r\nmsgid &quot;Failed to log into Absolute Radio.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30112&quot;\r\nmsgid &quot;Login Failed :(&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30113&quot;\r\nmsgid &quot;Artist Information&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30114&quot;\r\nmsgid &quot;Unable to download artists info!&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30115&quot;\r\nmsgid &quot;No artist name showing!&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30116&quot;\r\nmsgid &quot;No audio stream is playing!&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30117&quot;\r\nmsgid &quot;Settings&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30118&quot;\r\nmsgid &quot;It's all about the song, not the video; gigs, not photo shoots; built to last, not flavour of the month; something to say, not something to sell.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30119&quot;\r\nmsgid &quot;Nothing but the biggest rock classics from the likes of Led Zeppelin, The Who, The Rolling Stones, Queen and more.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30120&quot;\r\nmsgid &quot;We're going to take you on a nostalgia trip, playing undisputed 1980s classics from Madonna, Duran Duran, Prince, Pet Shop Boys, Michael Jackson, Depeche Mode, U2, The Human League, The Police and more.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30121&quot;\r\nmsgid &quot;Timeless classics from the likes of The Beatles, Stones, Doors, Jimi Hendrix, The Who, Aretha Franklin, Elvis and the Kinks. The impact of this music is still being felt by the new artists of today.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30122&quot;\r\nmsgid &quot;The decade of pop, soul, disco and rock from the likes of Rod Stewart, Stevie Wonder, Elton John, Marvin Gaye, Slade, T. Rex, The Jackson 5, Blondie, ABBA, David Bowie and more.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30123&quot;\r\nmsgid &quot;Undisputed classics stretching from Oasis and Blur, to Primal Scream and the Chemical Brothers. Whether it's Radiohead or Portishead, the Stone Roses or Guns 'n Roses, we'll be playing all the best music you remember from the 90s and none of the duds.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30124&quot;\r\nmsgid &quot;The best of the noughties, from Coldplay to Keane, Eminem to Elbow, Arctic Monkeys to Amy Winehouse, Scissor Sisters to The Streets and Kings of Leon to The Killers.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30125&quot;\r\nmsgid &quot;Displays image and information about the artist or band currently streaming.&quot;\r\nmsgstr &quot;&quot;\r\n\r\nmsgctxt &quot;#30126&quot;\r\nmsgid &quot;Open settings.&quot;\r\nmsgstr &quot;&quot;\r\n\r\n<\/pre>\n<div id=\"artist-information\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Artist Information<\/h3>\n<p>We now need to go back to the <strong>resources<\/strong> folder and open the <strong>lib<\/strong> folder and create a empty file with the name <strong>__init__.py<\/strong> allowing the folder to be discovered. Next create another file called <strong>artistinfo.py<\/strong> and insert the following:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport urllib2\r\nimport json\r\n\r\n# Written by: Phantom Raspberry Blower\r\n# Date: 21-02-2017\r\n# Description: Module for downloading information about music artists\r\n\r\nFANART_URL = 'http:\/\/www.theaudiodb.com\/api\/v1\/json\/1\/search.php?s='\r\n#FANART_URL = 'https:\/\/www.theaudiodb.com\/api\/195003\/json\/1\/search.php?s='\r\n\r\n\r\nclass ArtistInfo:\r\n\r\n    def __init__(self, artist=None):\r\n        self.clear()\r\n        self.__artist_name = artist\r\n        print str(artist)\r\n        if artist is not None:\r\n            self.get_artist_info(artist)\r\n            print str(artist)\r\n\r\n    @property\r\n    def artist_id(self):\r\n        return self.__artist_id\r\n\r\n    @property\r\n    def artist_name(self):\r\n        return self.__artist_name\r\n\r\n    @property\r\n    def artist_aka(self):\r\n        return self.__artist_aka\r\n\r\n    @property\r\n    def rec_label(self):\r\n        return self.__rec_label\r\n\r\n    @property\r\n    def rec_label_id(self):\r\n        return self.__rec_label_id\r\n\r\n    @property\r\n    def year_formed(self):\r\n        return self.__year_formed\r\n\r\n    @property\r\n    def year_born(self):\r\n        return self.__year_born\r\n\r\n    @property\r\n    def year_died(self):\r\n        return self.__year_died\r\n\r\n    @property\r\n    def disbanded(self):\r\n        return self.__disbanded\r\n\r\n    @property\r\n    def style(self):\r\n        return self.__style\r\n\r\n    @property\r\n    def genre(self):\r\n        return self.__genre\r\n\r\n    @property\r\n    def mood(self):\r\n        return self.__mood\r\n\r\n    @property\r\n    def website(self):\r\n        return self.__website\r\n\r\n    @property\r\n    def facebook(self):\r\n        return self.__facebook\r\n\r\n    @property\r\n    def twitter(self):\r\n        return self.__twitter\r\n\r\n    @property\r\n    def biography_en(self):\r\n        return self.__biography_en\r\n\r\n    @property\r\n    def biography_de(self):\r\n        return self.__biography_de\r\n\r\n    @property\r\n    def biography_fr(self):\r\n        return self.__biography_fr\r\n\r\n    @property\r\n    def biography_cn(self):\r\n        return self.__biography_cn\r\n\r\n    @property\r\n    def biography_it(self):\r\n        return self.__biography_it\r\n\r\n    @property\r\n    def biography_jp(self):\r\n        return self.__biography_jp\r\n\r\n    @property\r\n    def biography_ru(self):\r\n        return self.__biography_ru\r\n\r\n    @property\r\n    def biography_es(self):\r\n        return self.__biography_es\r\n\r\n    @property\r\n    def biography_pt(self):\r\n        return self.__biography_pt\r\n\r\n    @property\r\n    def biography_se(self):\r\n        return self.__biography_se\r\n\r\n    @property\r\n    def biography_nl(self):\r\n        return self.__biography_nl\r\n\r\n    @property\r\n    def biography_hu(self):\r\n        return self.__biography_hu\r\n\r\n    @property\r\n    def biography_no(self):\r\n        return self.__biography_np\r\n\r\n    @property\r\n    def biography_il(self):\r\n        return self.__biography_il\r\n\r\n    @property\r\n    def biography_pl(self):\r\n        return self.__biography_pl\r\n\r\n    @property\r\n    def gender(self):\r\n        return self.__gender\r\n\r\n    @property\r\n    def members(self):\r\n        return self.__members\r\n\r\n    @property\r\n    def country(self):\r\n        return self.__country\r\n\r\n    @property\r\n    def country_code(self):\r\n        return self.__country_code\r\n\r\n    @property\r\n    def artist_thumb(self):\r\n        return self.__artist_thumb\r\n\r\n    @property\r\n    def artist_logo(self):\r\n        return self.__artist_logo\r\n\r\n    @property\r\n    def fanart(self):\r\n        return self.__fanart\r\n\r\n    @property\r\n    def fanart2(self):\r\n        return self.__fanart2\r\n\r\n    @property\r\n    def fanart3(self):\r\n        return self.__fanart3\r\n\r\n    @property\r\n    def banner(self):\r\n        return self.__banner\r\n\r\n    @property\r\n    def music_brainz_id(self):\r\n        return self.__music_brainz_id\r\n\r\n    @property\r\n    def last_fm_chart(self):\r\n        return self.__last_fm_chart\r\n\r\n    @property\r\n    def locked(self):\r\n        return self.__locked\r\n\r\n    def clear(self):\r\n        self.__artist_id = None\r\n        self.__artist_name = None\r\n        self.__artist_aka = None\r\n        self.__rec_label = None\r\n        self.__rec_label_id = None\r\n        self.__year_formed = None\r\n        self.__year_born = None\r\n        self.__year_died = None\r\n        self.__disbanded = None\r\n        self.__style = None\r\n        self.__genre = None\r\n        self.__mood = None\r\n        self.__website = None\r\n        self.__facebook = None\r\n        self.__twitter = None\r\n        self.__biography_en = None\r\n        self.__biography_de = None\r\n        self.__biography_fr = None\r\n        self.__biography_cn = None\r\n        self.__biography_it = None\r\n        self.__biography_jp = None\r\n        self.__biography_ru = None\r\n        self.__biography_es = None\r\n        self.__biography_pt = None\r\n        self.__biography_se = None\r\n        self.__biography_nl = None\r\n        self.__biography_hu = None\r\n        self.__biography_no = None\r\n        self.__biography_il = None\r\n        self.__biography_pl = None\r\n        self.__gender = None\r\n        self.__members = None\r\n        self.__country = None\r\n        self.__country_code = None\r\n        self.__artist_thumb = None\r\n        self.__artist_logo = None\r\n        self.__fanart = None\r\n        self.__fanart2 = None\r\n        self.__fanart3 = None\r\n        self.__banner = None\r\n        self.__fanart = None\r\n        self.__music_brainz_id = None\r\n        self.__last_fm_chart = None\r\n        self.locked = None\r\n\r\n    def _common_tasks(self, url):\r\n        &quot;&quot;&quot;\r\n        Download url and return result\r\n        &quot;&quot;&quot;\r\n#        req = urllib2.urlopen(url)\r\n        hdr = {'User-Agent': 'Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.11 (KHTML, like Gecko) Chrome\/23.0.1271.64 Safari\/537.11',\r\n               'Accept': 'text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8',\r\n               'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',\r\n               'Accept-Encoding': 'none',\r\n               'Accept-Language': 'en-US,en;q=0.8',\r\n               'Connection': 'keep-alive'}\r\n        req = urllib2.Request(url, headers=hdr)\r\n        response = urllib2.urlopen(req)\r\n        json_string = response.read()\r\n        parsed_json = json.loads(json_string)\r\n        return parsed_json\r\n\r\n    def _url_encode(self, text):\r\n        &quot;&quot;&quot;\r\n        Encode html ie. %26 = &amp;\r\n        &quot;&quot;&quot;\r\n        return (urllib2.quote(text.replace('and', '&amp;'), safe='')\r\n                .replace('%20', '+'))\r\n\r\n    def _artist_info(self, artist):\r\n        &quot;&quot;&quot;\r\n        Parse artist information and return a dictionary of items\r\n        &quot;&quot;&quot;\r\n        url = (FANART_URL + self._url_encode(artist))\r\n        try:\r\n            parsed_json = self._common_tasks(url)\r\n            self.__artist_id = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'idArtist']\r\n            self.__artist_name = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtist']\r\n            self.__artist_aka = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistAlternate']\r\n            self.__rec_label = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strLabel']\r\n            self.__rec_label_id = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'idLabel']\r\n            self.__year_formed = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'intFormedYear']\r\n            self.__year_born = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'intBornYear']\r\n            self.__year_died = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'intDiedYear']\r\n            self.__disbanded = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strDisbanded']\r\n            self.__style = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strStyle']\r\n            self.__genre = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strGenre']\r\n            self.__mood = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strMood']\r\n            self.__website = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strWebsite']\r\n            self.__facebook = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strFacebook']\r\n            self.__twitter = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strTwitter']\r\n            self.__biography_en = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyEN']\r\n            if self.__biography_en is not None:\r\n                self.__biography_en = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyEN'].encode('utf-8'))\r\n            self.__biography_de = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyDE']\r\n            if self.__biography_de is not None:\r\n                self.__biography_de = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyDE'].encode('utf-8'))\r\n            self.__biography_fr = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyFR']\r\n            if self.__biography_fr is not None:\r\n                self.__biography_fr = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyFR'].encode('utf-8'))\r\n            self.__biography_cn = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyCN']\r\n            if self.__biography_cn is not None:\r\n                self.__biography_cn = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyCN'].encode('utf-8'))\r\n            self.__biography_it = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyIT']\r\n            if self.__biography_it is not None:\r\n                self.__biography_it = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyIT'].encode('utf-8'))\r\n            self.__biography_jp = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyJP']\r\n            if self.__biography_jp is not None:\r\n                self.__biography_jp = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyJP'].encode('utf-8'))\r\n            self.__biography_ru = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyRU']\r\n            if self.__biography_ru is not None:\r\n                self.__biography_ru = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyRU'].encode('utf-8'))\r\n            self.__biography_es = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyES']\r\n            if self.__biography_es is not None:\r\n                self.__biography_es = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyES'].encode('utf-8'))\r\n            self.__biography_pt = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyPT']\r\n            if self.__biography_pt is not None:\r\n                self.__biography_pt = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyPT'].encode('utf-8'))\r\n            self.__biography_se = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographySE']\r\n            if self.__biography_se is not None:\r\n                self.__biography_se = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographySE'].encode('utf-8'))\r\n            self.__biography_nl = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyNL']\r\n            if self.__biography_nl is not None:\r\n                self.__biography_nl = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyNL'].encode('utf-8'))\r\n            self.__biography_hu = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyHU']\r\n            if self.__biography_hu is not None:\r\n                self.__biography_hu = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyHU'].encode('utf-8'))\r\n            self.__biography_no = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyNO']\r\n            if self.__biography_no is not None:\r\n                self.__biography_no = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyNO'].encode('utf-8'))\r\n            self.__biography_il = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyIL']\r\n            if self.__biography_il is not None:\r\n                self.__biography_il = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyIL'].encode('utf-8'))\r\n            self.__biography_pl = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strBiographyPL']\r\n            if self.__biography_pl is not None:\r\n                self.__biography_pl = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                       &#x5B;'strBiographyPL'].encode('utf-8'))\r\n            self.__gender = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strGender']\r\n            self.__members = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'intMembers']\r\n            self.__country = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strCountry']\r\n            self.__country_code = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strCountryCode']\r\n            self.__artist_thumb = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistThumb']\r\n            self.__artist_logo = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistLogo']\r\n            self.__fanart = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistFanart']\r\n            self.__fanart2 = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistFanart2']\r\n            self.__fanart3 = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistFanart3']\r\n            self.__banner = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strArtistBanner']\r\n            self.__music_brainz_id = (parsed_json&#x5B;'artists']&#x5B;0]\r\n                                      &#x5B;'strMusicBrainzID'])\r\n            self.__last_fm_chart = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strLastFMChart']\r\n            self.__locked = parsed_json&#x5B;'artists']&#x5B;0]&#x5B;'strLocked']\r\n            return {'artist_id': self.__artist_id,\r\n                    'artist': self.__artist_name,\r\n                    'artist_aka': self.__artist_aka,\r\n                    'rec_label': self.__rec_label,\r\n                    'rec_label_id': self.__rec_label_id,\r\n                    'year_formed': self.__year_formed,\r\n                    'year_born': self.__year_born,\r\n                    'year_died': self.__year_died,\r\n                    'disbanded': self.__disbanded,\r\n                    'style': self.__style,\r\n                    'genre': self.__genre,\r\n                    'mood': self.__mood,\r\n                    'website': self.__website,\r\n                    'facebook': self.__facebook,\r\n                    'twitter': self.__twitter,\r\n                    'biography_en': self.__biography_en,\r\n                    'biography_de': self.__biography_de,\r\n                    'biography_fr': self.__biography_fr,\r\n                    'biography_cn': self.__biography_cn,\r\n                    'biography_it': self.__biography_it,\r\n                    'biography_jp': self.__biography_jp,\r\n                    'biography_ru': self.__biography_ru,\r\n                    'biography_es': self.__biography_es,\r\n                    'biography_pt': self.__biography_pt,\r\n                    'biography_se': self.__biography_se,\r\n                    'biography_nl': self.__biography_nl,\r\n                    'biography_hu': self.__biography_hu,\r\n                    'biography_no': self.__biography_no,\r\n                    'biography_il': self.__biography_il,\r\n                    'biography_pl': self.__biography_pl,\r\n                    'gender': self.__gender,\r\n                    'members': self.__members,\r\n                    'country': self.__country,\r\n                    'country_code': self.__country_code,\r\n                    'artist_thumb': self.__artist_thumb,\r\n                    'artist_logo': self.__artist_logo,\r\n                    'fanart': self.__fanart,\r\n                    'fanart2': self.__fanart2,\r\n                    'fanart3': self.__fanart3,\r\n                    'banner': self.__banner,\r\n                    'music_brainz_id': self.__music_brainz_id,\r\n                    'last_fm_chart': self.__last_fm_chart,\r\n                    'locked': self.__locked\r\n                    }\r\n        except:\r\n            return 0\r\n\r\n    def get_artist_info(self, artist):\r\n        &quot;&quot;&quot;\r\n        Return artist information as dictionary. If no result try either\r\n        removing or prefixing the 'the' word.\r\n        &quot;&quot;&quot;\r\n        self.clear()\r\n        ai = self._artist_info(artist)\r\n        if ai != 0:\r\n            return ai\r\n        else:\r\n            if 'the ' in artist:\r\n                ai = self._artist_info(artist.replace('the ', ''))\r\n            else:\r\n                ai = self._artist_info('the ' + artist)\r\n            if ai == 0:\r\n                if 'junior' in artist:\r\n                  ai = self._artist_info(artist.replace('junior', 'jr.'))\r\n                if ai == 0:\r\n                  if '-' in artist:\r\n                    ai = self._artist_info(artist.replace('-', ' '))\r\n        return ai\r\n\r\n<\/pre>\n<p>The above code takes an artist name as input and returns all the information about that artist including links to images from the website <a href=\"http:\/\/www.theaudiodb.com\">www.theaudiodb.com<\/a><\/p>\n<div id=\"images\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Images<\/h3>\n<p>We now need to go back to the <strong>resources<\/strong> folder and open the <strong>media<\/strong> folder. This folder contains all the icons and fanart images used by the addon along with any screenshot images of the program once complete. Download the following images and save into this folder.<\/p>\n<h4 style=\"text-align: left;\">Icons<\/h4>\n<table class=\" aligncenter\" style=\"width: 401px; height: 403px;\">\n<tbody>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-614 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-660 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_classic_rock.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-652 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_60s.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<\/tr>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-654 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_70s.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-656 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_80s.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-658 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_90s.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<\/tr>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-650 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_00s.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-663 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/artist_info.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-665 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/settings.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 style=\"text-align: left;\">Fanart<\/h4>\n<table class=\" aligncenter\" style=\"width: 80%;\">\n<tbody>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-662 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-661 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_classic_rock_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-653 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_60s_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<\/tr>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-655 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_70s_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-657 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_80s_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-659 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_90s_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<\/tr>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-651 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio_00s_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-664 aligncenter\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/artist_info_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-648\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/settings_fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<div id=\"skins\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Skins<\/h3>\n<p>We now need to go back to the <strong>resources<\/strong> folder and open the <strong>skin<\/strong> folder. Now create a subfolder called <strong>Default<\/strong>, next create another subfolder in the Default folder called <strong>720p<\/strong>. This folder contains the layout for two screens; one shows the image of the current artist the other shows a detailed description of the artist.<\/p>\n<p>Create a new file called <strong>plugin-music-visualisation.xml<\/strong> and insert the following:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;window&gt;\r\n\t&lt;defaultcontrol&gt;-&lt;\/defaultcontrol&gt;\r\n\t&lt;controls&gt;\r\n\t\t&lt;control type=&quot;visualisation&quot; id=&quot;2&quot;&gt;\r\n\t\t\t&lt;!-- FIX ME Music Visualization needs to have an id of 2 in this window to be able to lock or change preset --&gt;\r\n\t\t\t&lt;description&gt;visualisation&lt;\/description&gt;\r\n\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t&lt;width&gt;1280&lt;\/width&gt;\r\n\t\t\t&lt;height&gt;720&lt;\/height&gt;\r\n\t\t&lt;\/control&gt;\r\n\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t&lt;description&gt;Fanart Image for Artist&lt;\/description&gt;\r\n\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t&lt;width&gt;1280&lt;\/width&gt;\r\n\t\t\t&lt;height&gt;720&lt;\/height&gt;\r\n\t\t\t&lt;aspectratio&gt;scale&lt;\/aspectratio&gt;\r\n\t\t\t&lt;!--&lt;texture background=&quot;true&quot;&gt;$INFO&#x5B;Player.Art(fanart)]&lt;\/texture&gt;--&gt;\r\n\t\t\t&lt;texture background=&quot;true&quot;&gt;$INFO&#x5B;Window(12006).Property(ArtistFanart)]&lt;\/texture&gt;\r\n\t\t\t&lt;visible&gt;!String.IsEmpty(Player.Art(fanart)) + !Skin.HasSetting(HideVisualizationFanart)&lt;\/visible&gt;\r\n\t\t\t&lt;fadetime&gt;600&lt;\/fadetime&gt;\r\n\t\t&lt;\/control&gt;\r\n\t\t&lt;!-- media infos --&gt;\r\n\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t&lt;depth&gt;DepthOSD&lt;\/depth&gt;\r\n\t\t\t&lt;animation effect=&quot;fade&quot; time=&quot;150&quot;&gt;VisibleChange&lt;\/animation&gt;\r\n\t\t\t&lt;visible&gt;&#x5B;Player.ShowInfo | Window.IsActive(MusicOSD)] + !&#x5B;Window.IsVisible(AddonSettings) | Window.IsVisible(SelectDialog) | Window.IsVisible(VisualisationPresetList) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide) | Window.IsVisible(PVRRadioRDSInfo) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(Addon)]&lt;\/visible&gt;\r\n\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t&lt;left&gt;-20&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;-150&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;1320&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;256&lt;\/height&gt;\r\n\t\t\t\t&lt;texture flipy=&quot;true&quot; border=&quot;1&quot;&gt;HomeNowPlayingBack.png&lt;\/texture&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t&lt;description&gt;Partymode Header label&lt;\/description&gt;\r\n\t\t\t\t&lt;left&gt;30&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;5&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;800&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t&lt;label&gt;$LOCALIZE&#x5B;589]&lt;\/label&gt;\r\n\t\t\t\t&lt;visible&gt;MusicPartyMode.Enabled&lt;\/visible&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t&lt;description&gt;Normal Header label&lt;\/description&gt;\r\n\t\t\t\t&lt;left&gt;30&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;5&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;800&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t&lt;label&gt;$INFO&#x5B;musicplayer.Playlistposition,$LOCALIZE&#x5B;554]: ]$INFO&#x5B;musicplayer.Playlistlength, \/ ]&lt;\/label&gt;\r\n\t\t\t\t&lt;visible&gt;!MusicPartyMode.Enabled&lt;\/visible&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t&lt;description&gt;Clock label&lt;\/description&gt;\r\n\t\t\t\t&lt;left&gt;450&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;5&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;800&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t&lt;label&gt;$INFO&#x5B;System.Time]&lt;\/label&gt;\r\n\t\t\t\t&lt;animation effect=&quot;slide&quot; start=&quot;0,0&quot; end=&quot;-30,0&quot; time=&quot;0&quot; condition=&quot;Player.Muted&quot;&gt;conditional&lt;\/animation&gt;\r\n\t\t\t\t&lt;animation effect=&quot;slide&quot; start=&quot;0,0&quot; end=&quot;-70,0&quot; time=&quot;0&quot; condition=&quot;system.getbool(input.enablemouse) + Window.IsVisible(MusicOSD)&quot;&gt;conditional&lt;\/animation&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t&lt;left&gt;-20&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;230r&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;1320&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;230&lt;\/height&gt;\r\n\t\t\t\t&lt;texture border=&quot;1&quot;&gt;HomeNowPlayingBack.png&lt;\/texture&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t&lt;depth&gt;DepthOSDPopout&lt;\/depth&gt;\r\n\t\t\t\t&lt;description&gt;cover image&lt;\/description&gt;\r\n\t\t\t\t&lt;left&gt;20&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;250r&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;300&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;230&lt;\/height&gt;\r\n\t\t\t\t&lt;texture fallback=&quot;DefaultAlbumCover.png&quot;&gt;$INFO&#x5B;Player.Art(thumb)]&lt;\/texture&gt;\r\n\t\t\t\t&lt;aspectratio aligny=&quot;bottom&quot;&gt;keep&lt;\/aspectratio&gt;\r\n\t\t\t\t&lt;bordertexture border=&quot;8&quot;&gt;ThumbShadow.png&lt;\/bordertexture&gt;\r\n\t\t\t\t&lt;bordersize&gt;8&lt;\/bordersize&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t&lt;left&gt;330&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;185r&lt;\/top&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot; id=&quot;1&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;Heading label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;910&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;label&gt;$LOCALIZE&#x5B;31040]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t\t&lt;animation effect=&quot;slide&quot; start=&quot;0,0&quot; end=&quot;0,25&quot; time=&quot;0&quot; condition=&quot;String.IsEmpty(MusicPlayer.Artist) + String.IsEmpty(MusicPlayer.Album)&quot;&gt;conditional&lt;\/animation&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot; id=&quot;1&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;Artist label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;20&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;30&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;910&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;font&gt;font12&lt;\/font&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;MusicPlayer.Artist]$INFO&#x5B;MusicPlayer.Album, - ]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;grey2&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;grouplist&quot;&gt;\r\n\t\t\t\t\t&lt;left&gt;20&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;62&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;910&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;35&lt;\/height&gt;\r\n\t\t\t\t\t&lt;itemgap&gt;5&lt;\/itemgap&gt;\r\n\t\t\t\t\t&lt;orientation&gt;horizontal&lt;\/orientation&gt;\r\n\t\t\t\t\t&lt;visible&gt;!system.getbool(audiooutput.dspaddonsenabled)&lt;\/visible&gt;\r\n\t\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t\t&lt;width min=&quot;10&quot; max=&quot;638&quot;&gt;auto&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;20&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;font&gt;font30&lt;\/font&gt;\r\n\t\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Player.Title]&lt;\/label&gt;\r\n\t\t\t\t\t\t&lt;textcolor&gt;orange&lt;\/textcolor&gt;\r\n\t\t\t\t\t\t&lt;scroll&gt;true&lt;\/scroll&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;Audio Codec Image&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;81&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;texture&gt;$INFO&#x5B;MusicPlayer.Codec,flagging\/audio\/,.png]&lt;\/texture&gt;\r\n\t\t\t\t\t\t&lt;visible&gt;!Player.ChannelPreviewActive&lt;\/visible&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;Rating&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;172&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t\t&lt;description&gt;rating back&lt;\/description&gt;\r\n\t\t\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t\t\t&lt;width&gt;172&lt;\/width&gt;\r\n\t\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t\t&lt;texture border=&quot;5&quot;&gt;flagging\/blank.png&lt;\/texture&gt;\r\n\t\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t\t&lt;description&gt;User Rating&lt;\/description&gt;\r\n\t\t\t\t\t\t\t&lt;left&gt;2&lt;\/left&gt;\r\n\t\t\t\t\t\t\t&lt;top&gt;5&lt;\/top&gt;\r\n\t\t\t\t\t\t\t&lt;width&gt;168&lt;\/width&gt;\r\n\t\t\t\t\t\t\t&lt;height&gt;21&lt;\/height&gt;\r\n\t\t\t\t\t\t\t&lt;texture fallback=&quot;ratings\/0.png&quot;&gt;$INFO&#x5B;MusicPlayer.UserRating,ratings\/,.png]&lt;\/texture&gt;\r\n\t\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\r\n\t\t\t\t&lt;control type=&quot;grouplist&quot;&gt;\r\n\t\t\t\t\t&lt;left&gt;20&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;60&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;910&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;35&lt;\/height&gt;\r\n\t\t\t\t\t&lt;itemgap&gt;5&lt;\/itemgap&gt;\r\n\t\t\t\t\t&lt;orientation&gt;horizontal&lt;\/orientation&gt;\r\n\t\t\t\t\t&lt;visible&gt;system.getbool(audiooutput.dspaddonsenabled)&lt;\/visible&gt;\r\n\t\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t\t&lt;width min=&quot;10&quot; max=&quot;557&quot;&gt;auto&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;20&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;font&gt;font30&lt;\/font&gt;\r\n\t\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Player.Title]&lt;\/label&gt;\r\n\t\t\t\t\t\t&lt;textcolor&gt;orange&lt;\/textcolor&gt;\r\n\t\t\t\t\t\t&lt;scroll&gt;true&lt;\/scroll&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;ADSP Master Mode Image&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;81&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;visible&gt;!&#x5B;String.IsEmpty(ADSP.MasterOwnIcon) | Player.ChannelPreviewActive]&lt;\/visible&gt;\r\n\t\t\t\t\t\t&lt;texture&gt;$INFO&#x5B;ADSP.MasterOwnIcon]&lt;\/texture&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;Audio Codec Image&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;81&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;visible&gt;String.IsEmpty(ADSP.MasterOverrideIcon) + !Player.ChannelPreviewActive&lt;\/visible&gt;\r\n\t\t\t\t\t\t&lt;texture&gt;$INFO&#x5B;MusicPlayer.Codec,flagging\/audio\/,.png]&lt;\/texture&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;ADSP Audio Codec Override Image&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;81&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;visible&gt;!&#x5B;String.IsEmpty(ADSP.MasterOwnIcon) | Player.ChannelPreviewActive]&lt;\/visible&gt;\r\n\t\t\t\t\t\t&lt;texture&gt;$INFO&#x5B;ADSP.MasterOverrideIcon]&lt;\/texture&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;Rating&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;width&gt;172&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t\t&lt;description&gt;rating back&lt;\/description&gt;\r\n\t\t\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t\t\t&lt;width&gt;172&lt;\/width&gt;\r\n\t\t\t\t\t\t\t&lt;height&gt;29&lt;\/height&gt;\r\n\t\t\t\t\t\t\t&lt;texture border=&quot;5&quot;&gt;flagging\/blank.png&lt;\/texture&gt;\r\n\t\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t\t\t&lt;description&gt;User Rating&lt;\/description&gt;\r\n\t\t\t\t\t\t\t&lt;left&gt;2&lt;\/left&gt;\r\n\t\t\t\t\t\t\t&lt;top&gt;5&lt;\/top&gt;\r\n\t\t\t\t\t\t\t&lt;width&gt;168&lt;\/width&gt;\r\n\t\t\t\t\t\t\t&lt;height&gt;21&lt;\/height&gt;\r\n\t\t\t\t\t\t\t&lt;texture fallback=&quot;ratings\/0.png&quot;&gt;$INFO&#x5B;MusicPlayer.UserRating,ratings\/,.png]&lt;\/texture&gt;\r\n\t\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;120&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;910&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;25&lt;\/height&gt;\r\n\t\t\t\t\t&lt;label&gt;$LOCALIZE&#x5B;19031]: $INFO&#x5B;MusicPlayer.offset(1).Artist,, - ]$INFO&#x5B;MusicPlayer.offset(1).Title]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;align&gt;center&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;font&gt;font12&lt;\/font&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;grey&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;scroll&gt;true&lt;\/scroll&gt;\r\n\t\t\t\t\t&lt;visible&gt;MusicPlayer.HasNext + !Window.IsVisible(MusicOSD)&lt;\/visible&gt;\r\n\t\t\t\t\t&lt;animation effect=&quot;fade&quot; time=&quot;150&quot;&gt;VisibleChange&lt;\/animation&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t&lt;left&gt;330&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;95r&lt;\/top&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;40&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Player.Time(hh:mm:ss)]&lt;\/label&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;progress&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;Progressbar&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;100&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;15&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;720&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;16&lt;\/height&gt;\r\n\t\t\t\t\t&lt;info&gt;Player.Progress&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;left&gt;820&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;40&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Player.Duration(hh:mm:ss)]&lt;\/label&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t&lt;\/control&gt;\r\n\t&lt;\/controls&gt;\r\n&lt;\/window&gt;\r\n\r\n<\/pre>\n<p>Now create another file called <strong>plugin-audio-absolute-radio.xml<\/strong> and insert the following:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;window&gt;\r\n\t&lt;defaultcontrol&gt;61&lt;\/defaultcontrol&gt;\r\n\t&lt;!-- &lt;onload condition=&quot;!MusicPlayer.Content(LiveTV)&quot;&gt;SetFocus(602)&lt;\/onload&gt; --&gt;\r\n\t&lt;controls&gt;\r\n\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t&lt;depth&gt;DepthDialog-&lt;\/depth&gt;\r\n\t\t\t&lt;animation effect=&quot;slide&quot; start=&quot;1100,0&quot; end=&quot;0,0&quot; time=&quot;300&quot; tween=&quot;quadratic&quot; easing=&quot;out&quot;&gt;WindowOpen&lt;\/animation&gt;\r\n\t\t\t&lt;animation effect=&quot;slide&quot; start=&quot;0,0&quot; end=&quot;1100,0&quot; time=&quot;300&quot; tween=&quot;quadratic&quot; easing=&quot;out&quot;&gt;WindowClose&lt;\/animation&gt;\r\n\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t&lt;left&gt;180&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;1120&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;720&lt;\/height&gt;\r\n\t\t\t\t&lt;texture border=&quot;15,0,0,0&quot; flipx=&quot;true&quot;&gt;MediaBladeSub.png&lt;\/texture&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;button&quot;&gt;\r\n\t\t\t\t&lt;description&gt;Close Window button&lt;\/description&gt;\r\n\t\t\t\t&lt;left&gt;200&lt;\/left&gt;\r\n\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t&lt;width&gt;64&lt;\/width&gt;\r\n\t\t\t\t&lt;height&gt;32&lt;\/height&gt;\r\n\t\t\t\t&lt;label&gt;-&lt;\/label&gt;\r\n\t\t\t\t&lt;font&gt;-&lt;\/font&gt;\r\n\t\t\t\t&lt;onclick&gt;PreviousMenu&lt;\/onclick&gt;\r\n\t\t\t\t&lt;texturefocus&gt;DialogCloseButton-focus.png&lt;\/texturefocus&gt;\r\n\t\t\t\t&lt;texturenofocus&gt;DialogCloseButton.png&lt;\/texturenofocus&gt;\r\n\t\t\t\t&lt;onleft&gt;61&lt;\/onleft&gt;\r\n\t\t\t\t&lt;onright&gt;61&lt;\/onright&gt;\r\n\t\t\t\t&lt;onup&gt;61&lt;\/onup&gt;\r\n\t\t\t\t&lt;ondown&gt;61&lt;\/ondown&gt;\r\n\t\t\t\t&lt;visible&gt;system.getbool(input.enablemouse)&lt;\/visible&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t&lt;animation effect=&quot;fade&quot; delay=&quot;300&quot; start=&quot;0&quot; end=&quot;100&quot; time=&quot;150&quot;&gt;WindowOpen&lt;\/animation&gt;\r\n\t\t\t\t&lt;animation effect=&quot;fade&quot; start=&quot;100&quot; end=&quot;0&quot; time=&quot;150&quot;&gt;WindowClose&lt;\/animation&gt;\r\n\t\t\t\t&lt;!-- Heading --&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(HeadingLabel)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;description&gt;header label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;210&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;50&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;1030&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font24_title&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;center&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;!-- Artist Image --&gt;\r\n\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist image&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;210&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;100&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;480&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;270&lt;\/height&gt;\r\n\t\t\t\t\t&lt;bordertexture border=&quot;5&quot;&gt;button-nofocus.png&lt;\/bordertexture&gt;\r\n\t\t\t\t\t&lt;bordersize&gt;4&lt;\/bordersize&gt;\r\n\t\t\t\t\t&lt;texture border=&quot;15,0,0,0&quot;&gt;$INFO&#x5B;Window(10147).Property(ArtistImage)]&lt;\/texture&gt;\r\n\t\t\t\t\t&lt;include&gt;VisibleFadeEffect&lt;\/include&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;!-- Artist Info --&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist style label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Style:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;100&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist style&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistStyle)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;100&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist genre label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Genre:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;130&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist genre&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistGenre)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;130&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist name label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Name:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;160&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist name&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistName)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;160&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist formed label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Formed:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;190&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist formed&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistFormed)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;190&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist born label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Born:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;220&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist born&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistBorn)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;220&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist died label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Died:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;250&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist died&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistDied)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;250&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist gender label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Gender:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;280&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist gender&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistGender)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;280&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist country label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Country:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;310&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist country&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistCountry)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;310&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist website label&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;Website:&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;720&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;340&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;right&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;blue&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;selected&lt;\/selectedcolor&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;label&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;artist website&lt;\/description&gt;\r\n\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(ArtistWebsite)]&lt;\/label&gt;\r\n\t\t\t\t\t&lt;left&gt;830&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;340&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;430&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;30&lt;\/height&gt;\r\n\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t&lt;align&gt;left&lt;\/align&gt;\r\n\t\t\t\t\t&lt;aligny&gt;center&lt;\/aligny&gt;\r\n\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t&lt;selectedcolor&gt;white&lt;\/selectedcolor&gt;\r\n\t\t\t\t\t&lt;info&gt;ListItem.Label2&lt;\/info&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;!-- Seperator --&gt;\r\n\t\t\t\t&lt;control type=&quot;image&quot;&gt;\r\n\t\t\t\t\t&lt;description&gt;seperator&lt;\/description&gt;\r\n\t\t\t\t\t&lt;left&gt;210&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;383&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;1030&lt;\/width&gt;\r\n\t\t\t\t\t&lt;height&gt;4&lt;\/height&gt;\r\n\t\t\t\t\t&lt;aspectratio&gt;stretch&lt;\/aspectratio&gt;\r\n\t\t\t\t\t&lt;texture&gt;separator.png&lt;\/texture&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t\t\t&lt;animation effect=&quot;fade&quot; delay=&quot;300&quot; start=&quot;0&quot; end=&quot;100&quot; time=&quot;150&quot;&gt;WindowOpen&lt;\/animation&gt;\r\n\t\t\t\t\t&lt;animation effect=&quot;fade&quot; start=&quot;100&quot; end=&quot;0&quot; time=&quot;150&quot;&gt;WindowClose&lt;\/animation&gt;\r\n\t\t\t\t\t&lt;left&gt;210&lt;\/left&gt;\r\n\t\t\t\t\t&lt;top&gt;395&lt;\/top&gt;\r\n\t\t\t\t\t&lt;width&gt;1100&lt;\/width&gt;\r\n\t\t\t\t\t&lt;control type=&quot;textbox&quot;&gt;\r\n\t\t\t\t\t\t&lt;description&gt;description textarea&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;label&gt;$INFO&#x5B;Window(10147).Property(Description)]&lt;\/label&gt;\r\n\t\t\t\t\t\t&lt;description&gt;description&lt;\/description&gt;\r\n\t\t\t\t\t\t&lt;left&gt;0&lt;\/left&gt;\r\n\t\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t\t&lt;width&gt;1015&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;310&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;label&gt;-&lt;\/label&gt;\r\n\t\t\t\t\t\t&lt;font&gt;font13&lt;\/font&gt;\r\n\t\t\t\t\t\t&lt;align&gt;justify&lt;\/align&gt;\r\n\t\t\t\t\t\t&lt;textcolor&gt;white&lt;\/textcolor&gt;\r\n\t\t\t\t\t\t&lt;shadowcolor&gt;black&lt;\/shadowcolor&gt;\r\n\t\t\t\t\t\t&lt;pagecontrol&gt;61&lt;\/pagecontrol&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t\t&lt;control type=&quot;scrollbar&quot; id=&quot;61&quot;&gt;\r\n\t\t\t\t\t\t&lt;left&gt;1030&lt;\/left&gt;\r\n\t\t\t\t\t\t&lt;top&gt;0&lt;\/top&gt;\r\n\t\t\t\t\t\t&lt;width&gt;25&lt;\/width&gt;\r\n\t\t\t\t\t\t&lt;height&gt;310&lt;\/height&gt;\r\n\t\t\t\t\t\t&lt;texturesliderbackground border=&quot;0,14,0,14&quot;&gt;ScrollBarV.png&lt;\/texturesliderbackground&gt;\r\n\t\t\t\t\t\t&lt;texturesliderbar border=&quot;0,14,0,14&quot;&gt;ScrollBarV_bar.png&lt;\/texturesliderbar&gt;\r\n\t\t\t\t\t\t&lt;texturesliderbarfocus border=&quot;0,14,0,14&quot;&gt;ScrollBarV_bar_focus.png&lt;\/texturesliderbarfocus&gt;\r\n\t\t\t\t\t\t&lt;textureslidernib&gt;ScrollBarNib.png&lt;\/textureslidernib&gt;\r\n\t\t\t\t\t\t&lt;textureslidernibfocus&gt;ScrollBarNib.png&lt;\/textureslidernibfocus&gt;\r\n\t\t\t\t\t\t&lt;onleft&gt;61&lt;\/onleft&gt;\r\n\t\t\t\t\t\t&lt;onright&gt;61&lt;\/onright&gt;\r\n\t\t\t\t\t\t&lt;ondown&gt;61&lt;\/ondown&gt;\r\n\t\t\t\t\t\t&lt;onup&gt;61&lt;\/onup&gt;\r\n\t\t\t\t\t\t&lt;showonepage&gt;true&lt;\/showonepage&gt;\r\n\t\t\t\t\t\t&lt;orientation&gt;vertical&lt;\/orientation&gt;\r\n\t\t\t\t\t&lt;\/control&gt;\r\n\t\t\t\t&lt;\/control&gt;\r\n\t\t\t&lt;\/control&gt;\r\n\t\t&lt;\/control&gt;\r\n\t\t&lt;control type=&quot;group&quot;&gt;\r\n\t\t\t&lt;depth&gt;DepthDialog-&lt;\/depth&gt;\r\n\t\t\t&lt;include&gt;Clock&lt;\/include&gt;\r\n\t\t&lt;\/control&gt;\r\n\t&lt;\/controls&gt;\r\n&lt;\/window&gt;\r\n\r\n<\/pre>\n<div id=\"settings\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Settings<\/h3>\n<p>We now need to go back to the <strong>resources<\/strong> folder and create an empty file named <strong>__init__.py<\/strong>, next create another file called <strong>settings.xml<\/strong>. This file holds the users settings on stream format, sound quality, displaying artist info and loging into Absolute Radio if the user has an account. Insert the following into the settings.xml file:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot;?&gt;\r\n&lt;settings&gt;\r\n    &lt;!--General--&gt;\r\n    &lt;category label=&quot;30001&quot;&gt;\r\n        &lt;setting type=&quot;lsep&quot; label=&quot;30002&quot; \/&gt;\r\n        &lt;setting id=&quot;compression_format&quot; type=&quot;select&quot; label=&quot;30004&quot; values=&quot;AAC|MP3|Ogg Vorbis|Ogg FLAC - Lossless|Opus&quot; default=&quot;AAC&quot; \/&gt;\r\n        &lt;setting id=&quot;bitrate.aac&quot; type=&quot;select&quot; label=&quot;Bitrate&quot; values=&quot;24kbps|64kbps|128kbps&quot; default=&quot;24kbps&quot; visible=&quot;eq(-1,AAC)&quot; \/&gt;\r\n        &lt;setting id=&quot;bitrate.mp3&quot; type=&quot;select&quot; label=&quot;Bitrate&quot; values=&quot;32kbps|128kbps&quot; default=&quot;32kbps&quot; visible=&quot;eq(-2,MP3)&quot; \/&gt;\r\n        &lt;setting id=&quot;bitrate.ogg&quot; type=&quot;select&quot; label=&quot;Bitrate&quot; values=&quot;32kbps|160kbps&quot; default=&quot;32kbps&quot; visible=&quot;eq(-3,Ogg Vorbis)&quot; \/&gt;\r\n        &lt;setting id=&quot;bitrate.ogg-flac&quot; type=&quot;select&quot; label=&quot;Bitrate&quot; values=&quot;1024kbps&quot; default=&quot;1024kbps&quot; visible=&quot;eq(-4,Ogg FLAC - Lossless)&quot; \/&gt;\r\n        &lt;setting id=&quot;bitrate.opus&quot; type=&quot;select&quot; label=&quot;Bitrate&quot; values=&quot;24kbps|64kbps|96kbps&quot; default=&quot;24kbps&quot; visible=&quot;eq(-5,Opus)&quot; \/&gt;\r\n        &lt;setting type=&quot;lsep&quot; label=&quot;30113&quot; \/&gt;\r\n        &lt;setting id=&quot;hide_artist_info&quot; type=&quot;bool&quot; label=&quot;30009&quot; value=&quot;false&quot; \/&gt;\r\n        &lt;setting id=&quot;hide_artist_artwork&quot; type=&quot;bool&quot; label=&quot;30003&quot; value=&quot;false&quot; \/&gt;\r\n        &lt;setting type=&quot;lsep&quot; label=&quot;30006&quot; \/&gt;\r\n        &lt;setting id=&quot;username&quot; type=&quot;text&quot; label=&quot;30007&quot; value=&quot;&quot; \/&gt;\r\n        &lt;setting id=&quot;password&quot; type=&quot;text&quot; label=&quot;30008&quot; value=&quot;&quot; option=&quot;hidden&quot; enable=&quot;!eq(-1,'')&quot; \/&gt;\r\n    &lt;\/category&gt;\r\n&lt;\/settings&gt;\r\n\r\n<\/pre>\n<div id=\"icon-and-fanart\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Icon &amp; Fanart<\/h3>\n<p>You may have noticed the text in the above code contains the unique number from the language settings we created ealier. Download the icon and fanart image and save to the <strong>resources<\/strong> folder.<\/p>\n<table class=\" aligncenter\" style=\"width: 223px; height: 262px;\">\n<tbody>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-678\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/icon-3.png\" alt=\"\" width=\"128\" height=\"128\" \/><\/th>\n<\/tr>\n<tr>\n<th><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-677\" src=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/fanart.jpg\" alt=\"\" width=\"213\" height=\"120\" \/><\/th>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<div id=\"addon-details\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Addon Details<\/h3>\n<p>We now need to go back to the <strong>plugin.audio.absolute-radio<\/strong> folder and create a new file named <strong>addon.xml<\/strong> . This file defines the what the name of the addon is, what dependances are requied by the addon etc. Insert the following:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;\r\n&lt;addon id=&quot;plugin.audio.absolute-radio&quot; name=&quot;Absolute Radio&quot; version=&quot;1.0.6&quot; provider-name=&quot;Phantom Raspberry Blower&quot;&gt;\r\n  &lt;requires&gt;\r\n    &lt;import addon=&quot;xbmc.python&quot; version=&quot;2.25.0&quot;\/&gt;\r\n  &lt;\/requires&gt;\r\n  &lt;extension point=&quot;xbmc.python.pluginsource&quot; library=&quot;addon.py&quot;&gt;\r\n    &lt;provides&gt;audio&lt;\/provides&gt;\r\n  &lt;\/extension&gt;\r\n  &lt;extension point=&quot;xbmc.addon.metadata&quot;&gt;\r\n    &lt;summary&gt;Absolute Radio&lt;\/summary&gt;\r\n    &lt;description&gt;\r\n      Absolute Radio is one of the UK's Independent National Radio stations. The station is based in London and plays popular rock music broadcasting on medium wave and DAB across the UK (105.8 FM in London and 105.2 FM in the West Midlands). It is also available in other parts of the world via satellite, cable, and on the Internet.\r\n    &lt;\/description&gt;\r\n    &lt;disclaimer&gt;\r\n      &#x5B;COLOR red]&#x5B;B]Phantom Raspberry Blower&#x5B;\/B]&#x5B;\/COLOR] does not host or distribute any of the content provided by this addon. Does not have any affiliation with the content provider and accepts no responsibility for the included addon.\r\n    &lt;\/disclaimer&gt;\r\n    &lt;platform&gt;all&lt;\/platform&gt;\r\n    &lt;language&gt;&lt;\/language&gt;\r\n    &lt;license&gt;GNU GENERAL PUBLIC LICENSE. Version 2, June 1991&lt;\/license&gt;\r\n    &lt;forum&gt;&lt;\/forum&gt;\r\n    &lt;website&gt;&lt;\/website&gt;\r\n    &lt;assets&gt;\r\n      &lt;icon&gt;resources\/icon.png&lt;\/icon&gt;\r\n      &lt;fanart&gt;resources\/fanart.jpg&lt;\/fanart&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot000.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot001.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot002.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot003.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot004.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot005.jpg&lt;\/screenshot&gt;\r\n      &lt;screenshot&gt;resources\/media\/screenshot006.jpg&lt;\/screenshot&gt;\r\n    &lt;\/assets&gt;\r\n    &lt;news&gt;Updated theaudiodb.com API&lt;\/news&gt;\r\n    &lt;email&gt;&lt;\/email&gt;\r\n    &lt;source&gt;https:\/\/github.com\/PhantomRaspberryBlower\/repository.prb-entertainment-pack\/tree\/master\/plugin.video.leicester-community-radio&lt;\/source&gt;\r\n  &lt;\/extension&gt;\r\n&lt;\/addon&gt;\r\n\r\n<\/pre>\n<div id=\"addon-code\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Addon Code<\/h3>\n<p>We can now start writing the main code for the addon. Create a new file and name it <strong>addon.py<\/strong> and insert the following:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n#!\/bin\/python\r\n\r\nimport xbmc\r\nimport xbmcplugin\r\nimport xbmcgui\r\nimport xbmcaddon\r\nimport urllib\r\nimport urllib2\r\nimport cookielib\r\nimport re\r\nimport sys\r\nimport os\r\n\r\nfrom resources.lib.artistinfo import ArtistInfo\r\n\r\nimport thread\r\n\r\n# Written by: Phantom Raspberry Blower (The PRB)\r\n# Date: 21-02-2017\r\n# Description: Addon for listening to Absolute Radio live broadcasts\r\n\r\n# Get addon details\r\n__addon_id__ = 'plugin.audio.absolute-radio'\r\n__addon__ = xbmcaddon.Addon(id=__addon_id__)\r\n__addonname__ = __addon__.getAddonInfo('name')\r\n__icon__ = __addon__.getAddonInfo('icon')\r\n__fanart__ = __addon__.getAddonInfo('fanart')\r\n__author__ = 'Phantom Raspberry Blower'\r\n__url__ = sys.argv&#x5B;0]\r\n__handle__ = int(sys.argv&#x5B;1])\r\n__baseurl__ = 'https:\/\/absoluteradio.co.uk\/listen\/links\/'\r\n__fanarturl__ = 'http:\/\/www.theaudiodb.com\/api\/v1\/json\/1\/search.php?s='\r\n__cookie_file__ = xbmc.translatePath(os.path.join('special:\/\/profile\/addon_data\/'\r\n                                                  'plugin.audio.absolute-radio',\r\n                                                  'cookies-absolute-radio'))\r\n\r\n# Get localized language text\r\n__language__ = __addon__.getLocalizedString\r\n_login_success_title = __language__(30109)\r\n_login_success_msg = __language__(30110)\r\n_login_failed_title = __language__(30111)\r\n_login_failed_msg = __language__(30112)\r\n_artist_info = __language__(30113)\r\n_unable_to_download_artist = __language__(30114)\r\n_no_artist_name_present = __language__(30115)\r\n_no_audio_stream = __language__(30116)\r\n_settings = __language__(30117)\r\n_ar_desc = __language__(30118)\r\n_ar_cr_desc = __language__(30119)\r\n_ar_80s_desc = __language__(30120)\r\n_ar_60s_desc = __language__(30121)\r\n_ar_70s_desc = __language__(30122)\r\n_ar_90s_desc = __language__(30123)\r\n_ar_00s_desc = __language__(30124)\r\n_download_artist_info_desc = __language__(30125)\r\n_settings_desc = __language__(30126)\r\n\r\n# Get addon user settings\r\n_compression_format = __addon__.getSetting('compression_format')\r\n_hide_artist_info = __addon__.getSetting('hide_artist_info')\r\n_hide_artist_artwork = __addon__.getSetting('hide_artist_artwork')\r\n\r\n# Define local variables\r\ng_default_image = None\r\nimage_path = xbmc.translatePath(os.path.join('special:\/\/home\/addons\/',\r\n\t                            __addon_id__ + '\/resources\/media\/'))\r\nlink_info = {'Absolute Radio':\r\n             {'thumbs': os.path.join(image_path, \r\n                                     'absolute_radio.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_fanart.jpg'),\r\n              'desc': _ar_desc\r\n              },\r\n             'Absolute Classic Rock':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_classic_rock.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_classic_rock'\r\n                                     '_fanart.jpg'),\r\n              'desc': _ar_cr_desc\r\n              },\r\n             'Absolute 80s':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_80s.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_80s_fanart.jpg'),\r\n              'desc': _ar_80s_desc\r\n              },\r\n             'Absolute Radio 60s':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_60s.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_60s_fanart.jpg'),\r\n              'desc': _ar_60s_desc\r\n              },\r\n             'Absolute Radio 70s':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_70s.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_70s_fanart.jpg'),\r\n              'desc': _ar_70s_desc\r\n              },\r\n             'Absolute Radio 90s':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_90s.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_90s_fanart.jpg'),\r\n              'desc': _ar_90s_desc\r\n              },\r\n             'Absolute Radio 00s':\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'absolute_radio_00s.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'absolute_radio_00s_fanart.jpg'),\r\n              'desc': _ar_00s_desc\r\n              },\r\n             _artist_info:\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'artist_info.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'artist_info_fanart.jpg'),\r\n              'desc': _download_artist_info_desc\r\n              },\r\n             _settings:\r\n             {'thumbs': os.path.join(image_path,\r\n                                     'settings.png'),\r\n              'fanart': os.path.join(image_path,\r\n                                     'settings_fanart.jpg'),\r\n              'desc': _settings_desc\r\n              }\r\n             }\r\n\r\n\r\ndef _login_absolute_radio(username, password):\r\n    &quot;&quot;&quot;\r\n    Login into absolute radio and save the cookie to the cookie jar\r\n    subsequent login's will re-use the cookie.\r\n    &quot;&quot;&quot;\r\n    cookie_jar = cookielib.LWPCookieJar(__cookie_file__)\r\n    try:\r\n        cookie_jar.load()\r\n    except:\r\n        pass\r\n    cookies = cookie_jar\r\n    if len(cookies) &gt; 1:\r\n        return True\r\n    else:\r\n        url = 'https:\/\/absoluteradio.co.uk\/_ajax\/account-process.php'\r\n        values = {'emailfield': username,\r\n                  'passwordfield': password,\r\n                  'signinbutton': 'signin'}\r\n        data = urllib.urlencode(values)\r\n        opener = urllib2.build_opener(\r\n            urllib2.HTTPRedirectHandler(),\r\n            urllib2.HTTPHandler(debuglevel=0),\r\n            urllib2.HTTPSHandler(debuglevel=0),\r\n            urllib2.HTTPCookieProcessor(cookies))\r\n        response = opener.open(url, data)\r\n        the_page = response.read()\r\n        http_headers = response.info()\r\n        # The login cookies should be contained in the cookies variable\r\n        if len(cookies) &gt; 1:\r\n            cookie_jar.save(ignore_discard=True)\r\n            notification(_login_success_title,\r\n                             _login_success_msg, __icon__, 5000)\r\n            return True\r\n        else:\r\n            notification(_login_failed_title,\r\n                             _login_failed_msg, __icon__, 5000)\r\n            return False\r\n\r\n\r\ndef _get_url(url):\r\n    &quot;&quot;&quot;\r\n    Download url and remove carriage return\r\n    and tab spaces from page\r\n    &quot;&quot;&quot;\r\n    req = urllib2.Request(url)\r\n    req.add_header('User-Agent',\r\n                   'Mozilla\/5.0 (Windows; '\r\n                   'U; Windows NT 5.1; en-GB; '\r\n                   'rv:1.9.0.3) Gecko\/2008092417 Firefox\/3.0.3')\r\n    response = urllib2.urlopen(req)\r\n    link = response.read()\r\n    response.close()\r\n    return link\r\n\r\n\r\ndef categories():\r\n    &quot;&quot;&quot;\r\n    Download categories from absolute radio\r\n    and display a list of the stations\r\n    &quot;&quot;&quot;\r\n    response = _get_url(__baseurl__)\r\n    response = response.replace('\\n', '').replace('\\t', '').replace('  ', '')\r\n    headings = re.compile('&lt;h3&gt;(.+?)&lt;\/h3&gt;').findall(response)\r\n    if len(__addon__.getSetting('username')) &gt; 1:\r\n        _login_absolute_radio(__addon__.getSetting('username'),\r\n                              __addon__.getSetting('password'))\r\n    for item in headings:\r\n        if 'Trial' not in item:\r\n            list_item = item.replace(' stream URLs', '')\r\n            addDir(list_item,\r\n                   __baseurl__,\r\n                   1,\r\n                   link_info&#x5B;list_item]&#x5B;'thumbs'],\r\n                   link_info&#x5B;list_item]&#x5B;'fanart'],\r\n                   link_info&#x5B;list_item]&#x5B;'desc'],\r\n                   isFolder=False)\r\n    if _hide_artist_info != 'true':\r\n        addDir(_artist_info,\r\n               'XBMC.RunPlugin({0}?url=artistinfo&amp;mode=4)',\r\n               4,\r\n               link_info&#x5B;_artist_info]&#x5B;'thumbs'],\r\n               link_info&#x5B;_artist_info]&#x5B;'fanart'],\r\n               link_info&#x5B;_artist_info]&#x5B;'desc'],\r\n               isFolder=False)\r\n    addDir(_settings,\r\n           'XBMC.RunPlugin({0}?url=settings&amp;mode=5)',\r\n           5,\r\n           link_info&#x5B;_settings]&#x5B;'thumbs'],\r\n           link_info&#x5B;_settings]&#x5B;'fanart'],\r\n           link_info&#x5B;_settings]&#x5B;'desc'],\r\n           isFolder=False)\r\n\r\n\r\ndef get_links(name, url, icon, fanart):\r\n    &quot;&quot;&quot;\r\n    Fetch user's compression format and bitrate settings.\r\n    Download links to the audio stream location.\r\n    &quot;&quot;&quot;\r\n    response = _get_url(url).replace(' stream URLs', '')\r\n    response = response.replace('\\n', '').replace('\\t', '').replace('  ', '')\r\n    filter = re.compile('&lt;h3&gt;' +\r\n                        name +\r\n                        '&lt;\/h3&gt;(.+?)&lt;\/p&gt;').findall(response)\r\n    regex = '&lt;strong&gt;(.+?)&lt;\/strong&gt; &lt;span class=&quot;display-url&quot;&gt;(.+?)&lt;\/span&gt;'\r\n    data = re.compile(regex).findall(str(filter))\r\n    compression_format = _compression_format\r\n    bitrate = None\r\n    if compression_format == 'AAC':\r\n        bitrate = __addon__.getSetting('bitrate.aac')\r\n        compression_format = 'AAC+'\r\n    elif compression_format == 'MP3':\r\n        bitrate = __addon__.getSetting('bitrate.mp3')\r\n    elif compression_format == 'Ogg Vorbis':\r\n        bitrate = __addon__.getSetting('bitrate.ogg')\r\n    elif compression_format == 'Ogg FLAC - Lossless':\r\n        bitrate = __addon__.getSetting('bitrate.ogg-flac')\r\n    elif compression_format == 'Opus':\r\n        bitrate = __addon__.getSetting('bitrate.opus')\r\n    sound_quality = '%s (%s)' % (compression_format, bitrate)\r\n    for quality, link in data:\r\n        if (quality.replace(':', '').replace('~', '') ==\r\n                sound_quality.replace('- Lossless (1024kbps)', '1Mb')\r\n                .replace('(', '')\r\n                .replace('bps)', '')):\r\n            get_audio(sound_quality, link, icon, fanart)\r\n\r\n\r\ndef get_audio(name, url, icon, fanart):\r\n    &quot;&quot;&quot;\r\n    Parse the file location and title links from audio stream location.\r\n    &quot;&quot;&quot;\r\n    response = _get_url(url)\r\n    files = re.compile('File1=(.+?)\\n').findall(response)\r\n    titles = re.compile('Title1=(.+?)\\n').findall(response)\r\n    for file in files:\r\n        for title in titles:\r\n            play_audio(title, file, icon, fanart)\r\n            while not xbmc.Player().isPlayingAudio():\r\n                xbmc.sleep(3)\r\n            thread.start_new_thread( _show_artist_image,())\r\n\r\n\r\ndef play_audio(name, url, icon, fanart):\r\n    &quot;&quot;&quot;\r\n    Create a list item to the audio stream and\r\n    start playing the audio stream.\r\n    &quot;&quot;&quot;\r\n    if xbmc.Player().isPlayingAudio:\r\n        xbmc.Player().stop()\r\n    liz = xbmcgui.ListItem(str(name),\r\n                           iconImage='Icon.png',\r\n                           thumbnailImage=icon)\r\n    # Set a fanart image for the list item.\r\n    liz.setProperty('fanart_image', fanart)\r\n    xbmc.Player().play(url, liz, False)\r\n    xbmc.executebuiltin('Action(Fullscreen)')\r\n\r\n\r\ndef notification(message, title, icon, duration):\r\n    # Show message notification\r\n    dialog = xbmcgui.Dialog()\r\n    dialog.notification(title, message, icon, duration)\r\n\r\n\r\ndef message(message, title):\r\n    # Display message to user\r\n    dialog = xbmcgui.Dialog()\r\n    dialog.ok(title, message)\r\n\r\n\r\ndef show_artist_info():\r\n    if xbmc.Player().isPlayingAudio():\r\n        try:\r\n            my_title = xbmc.Player().getMusicInfoTag().getTitle()\r\n            if len(my_title) &gt; 0:\r\n                items = my_title.split(' - ')\r\n                artist = items&#x5B;0]\r\n                song = items&#x5B;1]\r\n                previous = my_title\r\n                if len(song) &gt; 1:\r\n                    show_artist_details(artist)\r\n                else:\r\n                    message(_unable_to_download_artist, _artist_info)\r\n            else:\r\n                message(_no_artist_name_present, _artist_info)\r\n            _show_artist_image()\r\n        except:\r\n            message(_unable_to_download_artist, _artist_info)\r\n    else:\r\n        message(_no_audio_stream, _artist_info)\r\n\r\n\r\ndef show_artist_details(artistname):\r\n    artist_info = ArtistInfo(artistname)\r\n    home = xbmc.translatePath('special:\/\/home')\r\n    if xbmc.getInfoLabel('System.ProfileName') != 'Master user':\r\n        you = xbmc.getInfoLabel('System.ProfileName')\r\n    elif (xbmc.getCondVisibility('System.Platform.Windows') is True or\r\n          xbmc.getCondVisibility('System.Platform.OSX') is True):\r\n        if 'Users\\\\' in home:\r\n            proyou = str(home).split('Users\\\\')\r\n            preyou = str(proyou&#x5B;1]).split('\\\\')\r\n            you = preyou&#x5B;0]\r\n        else:\r\n            you = 'You'\r\n    else:\r\n        you = 'You'\r\n    window = xbmcgui.WindowXMLDialog('plugin-audio-absolute-radio.xml',\r\n                                     __addon__.getAddonInfo('path'))\r\n    win = xbmcgui.Window(10147)\r\n    win.setProperty('HeadingLabel',\r\n                    artistname)\r\n    # Property can be accessed in the XML using:\r\n    # &lt;label fallback=&quot;416&quot;&gt;$INFO&#x5B;Window(10147).Property(HeadingLabel)]&lt;\/label&gt;\r\n    win.setProperty('ArtistImage',\r\n                    artist_info.fanart)\r\n    win.setProperty('ArtistStyle',\r\n                    artist_info.style)\r\n    win.setProperty('ArtistGenre',\r\n                    artist_info.genre)\r\n    win.setProperty('ArtistName',\r\n                    artist_info.artist_name)\r\n    win.setProperty('ArtistFormed',\r\n                    str(artist_info.year_formed).replace('None', ''))\r\n    win.setProperty('ArtistBorn',\r\n                    str(artist_info.year_born).replace('None', ''))\r\n    win.setProperty('ArtistDied',\r\n                    str(artist_info.year_died).replace('None', ''))\r\n    win.setProperty('ArtistGender',\r\n                    artist_info.gender)\r\n    win.setProperty('ArtistCountry',\r\n                    artist_info.country.replace('None', '') + ' ' +\r\n                    artist_info.country_code.replace('None', ''))\r\n    win.setProperty('ArtistWebsite',\r\n                    artist_info.website)\r\n    win.setProperty('Description',\r\n                    artist_info.biography_en)\r\n    window.doModal()\r\n    del window\r\n\r\n\r\ndef get_current_artist_image():\r\n    &quot;&quot;&quot;\r\n    Discover artist name, download image and return the image path\r\n    if no image can be found return the default image instead\r\n    &quot;&quot;&quot;\r\n    global g_default_image\r\n    # Find the current artist name\r\n    artist_name = ''\r\n    if xbmc.Player().isPlayingAudio():\r\n        try:\r\n            my_title = xbmc.Player().getMusicInfoTag().getTitle()\r\n            if len(my_title) &gt; 0:\r\n                items = my_title.split(' - ')\r\n                artist = items&#x5B;0]\r\n                song = items&#x5B;1]\r\n                previous = my_title\r\n                if len(song) &gt; 1:\r\n                    artist_name = artist\r\n        except:\r\n            notification(_no_artist_name_present,\r\n                             _artist_info, __icon__, 5000)\r\n    else:\r\n        notification(_no_audio_stream, _artist_info, __icon__, 5000)\r\n    # Find artist image\r\n    if len(artist_name) &gt; 1:\r\n        # Find the artist information\r\n        artist_info = ArtistInfo(artist_name)\r\n        if artist_info != 0:\r\n            try:\r\n                if len(artist_info.fanart) &gt; 1:\r\n                    return artist_info.fanart\r\n                else:\r\n                    return g_default_image\r\n            except:\r\n                return g_default_image\r\n        else:\r\n            return g_default_image\r\n    else:\r\n        return g_default_image\r\n\r\n\r\ndef _show_artist_image():\r\n    global g_default_image\r\n    window = xbmcgui.WindowXMLDialog('plugin-music-visualisation.xml',\r\n                                     __addon__.getAddonInfo('path'))\r\n    win = xbmcgui.Window(12006)\r\n    window.show()\r\n    if xbmc.Player().isPlayingAudio():\r\n        my_title = xbmc.Player().getMusicInfoTag().getTitle()\r\n    previous_title = ''\r\n    # main loop\r\n    while (not xbmc.Monitor().abortRequested() and\r\n           xbmc.Player().isPlayingAudio()):\r\n        if _hide_artist_artwork != 'true':\r\n            my_title = xbmc.Player().getMusicInfoTag().getTitle()\r\n            if my_title != previous_title:\r\n                # check if we are on the music visualization screen\r\n                # do not try and set image for any background media\r\n                if xbmc.getCondVisibility(&quot;Player.IsInternetStream&quot;):\r\n                    win.setProperty('ArtistFanart',\r\n                                    get_current_artist_image())\r\n                previous_title = my_title\r\n        else:\r\n            win.setProperty('ArtistFanart', g_default_image)\r\n        xbmc.sleep(1000)\r\n    del window\r\n\r\n\r\ndef get_params():\r\n    &quot;&quot;&quot;\r\n    Parse the paramters sent to the application\r\n    &quot;&quot;&quot;\r\n    param = &#x5B;]\r\n    paramstring = sys.argv&#x5B;2]\r\n    if len(paramstring) &gt;= 2:\r\n        params = sys.argv&#x5B;2]\r\n        cleanedparams = params.replace('?', '')\r\n        if (params&#x5B;len(params)-1] == '\/'):\r\n            params = params&#x5B;0:len(params)-2]\r\n        pairsofparams = cleanedparams.split('&amp;')\r\n        param = {}\r\n        for i in range(len(pairsofparams)):\r\n            splitparams = {}\r\n            splitparams = pairsofparams&#x5B;i].split('=')\r\n            if (len(splitparams)) == 2:\r\n                param&#x5B;splitparams&#x5B;0]] = splitparams&#x5B;1]\r\n    return param\r\n\r\n\r\ndef addDir(name, url, mode, icon, fanart, desc, isFolder=False):\r\n    &quot;&quot;&quot;\r\n    Display a list of links\r\n    &quot;&quot;&quot;\r\n    u = (sys.argv&#x5B;0] + '?url=' + urllib.quote_plus(url) +\r\n         '&amp;mode=' + str(mode) + '&amp;name=' + urllib.quote_plus(name) +\r\n         '&amp;icon=' + str(icon) + '&amp;fanart=' + str(fanart))\r\n    ok = True\r\n    liz = xbmcgui.ListItem(name)\r\n\r\n    # Set fanart and thumb images for the list item.\r\n    if not fanart:\r\n        fanart = __fanart__\r\n    if not icon:\r\n        icon = __icon__\r\n    liz.setArt({'fanart': fanart,\r\n                'thumb': icon})\r\n\r\n    # Set additional info for the list item.\r\n    liz.setInfo(type='music',\r\n                infoLabels={'title': name,\r\n                            'artist': name,\r\n                            'description': desc,\r\n                            'genre': 'Internet Radio',\r\n                            'year': 2015,\r\n                            'mediatype': 'album'\r\n                            }\r\n                )\r\n    ok = xbmcplugin.addDirectoryItem(handle=__handle__,\r\n                                     url=u,\r\n                                     listitem=liz,\r\n                                     isFolder=isFolder)\r\n    return ok\r\n\r\n\r\n# Define local variables\r\nparams = get_params()\r\nurl = None\r\nname = None\r\nmode = None\r\nicon = None\r\nfanart = None\r\n\r\n# Parse the url, name, mode, icon and fanart parameters\r\ntry:\r\n    url = urllib.unquote_plus(params&#x5B;'url'])\r\nexcept:\r\n    pass\r\ntry:\r\n    name = urllib.unquote_plus(params&#x5B;'name'])\r\nexcept:\r\n    pass\r\ntry:\r\n    mode = int(params&#x5B;'mode'])\r\nexcept:\r\n    pass\r\ntry:\r\n    icon = urllib.unquote_plus(params&#x5B;'icon'])\r\nexcept:\r\n    pass\r\ntry:\r\n    fanart = urllib.unquote_plus(params&#x5B;'fanart'])\r\nexcept:\r\n    pass\r\n\r\n# Route the request based upon the mode number\r\nif mode is None or url is None or len(url) &lt; 1:\r\n    categories()\r\nelif mode == 1:\r\n    g_default_image = fanart\r\n    get_links(name, url, icon, fanart)\r\nelif mode == 2:\r\n    get_audio(name, url, icon, fanart)\r\nelif mode == 3:\r\n    play_audio(name, url, icon, fanart)\r\nelif mode == 4:\r\n    show_artist_info()\r\nelif mode ==5:\r\n    __addon__.openSettings()\r\n    xbmc.executebuiltin(&quot;Container.Refresh&quot;)\r\n\r\n\r\nxbmcplugin.endOfDirectory(__handle__)\r\n\r\n<\/pre>\n<div id=\"activate-addon\"><\/div>\n<p>&nbsp;<\/p>\n<h3>Activate Addon<\/h3>\n<p>Shut down and restart Kodi then navigate to <strong>System<\/strong>><strong>Add-ons<\/strong>><strong>My Addons<\/strong>><strong>Music Addons<\/strong> and click onto <strong>Absolute Radio<\/strong> and <strong>Enable<\/strong>. You can now use your new addon in Kodi \ud83d\ude42<\/p>\n<p>That&#8217;s All Folks!!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial will describe how to create a music addon for the popular Kodi media center. The addon we will be creating will recieve streams from the radio station Absolute Radio. Absolute Radio is one of the UK&#8217;s Independent National Radio stations. The station is based in London and plays popular rock music broadcasting on [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":59,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.12 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.bulis.co.uk\/?page_id=641\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower\" \/>\n<meta property=\"og:description\" content=\"This tutorial will describe how to create a music addon for the popular Kodi media center. The addon we will be creating will recieve streams from the radio station Absolute Radio. Absolute Radio is one of the UK&#8217;s Independent National Radio stations. The station is based in London and plays popular rock music broadcasting on [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.bulis.co.uk\/?page_id=641\" \/>\n<meta property=\"og:site_name\" content=\"Phantom Raspberry Blower\" \/>\n<meta property=\"article:modified_time\" content=\"2018-10-29T16:12:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"53 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.bulis.co.uk\/?page_id=641\",\"url\":\"http:\/\/www.bulis.co.uk\/?page_id=641\",\"name\":\"Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower\",\"isPartOf\":{\"@id\":\"http:\/\/www.bulis.co.uk\/#website\"},\"datePublished\":\"2018-09-27T21:34:03+00:00\",\"dateModified\":\"2018-10-29T16:12:39+00:00\",\"breadcrumb\":{\"@id\":\"http:\/\/www.bulis.co.uk\/?page_id=641#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.bulis.co.uk\/?page_id=641\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.bulis.co.uk\/?page_id=641#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/www.bulis.co.uk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials\",\"item\":\"http:\/\/www.bulis.co.uk\/?page_id=57\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Kodi Tutorials\",\"item\":\"http:\/\/www.bulis.co.uk\/?page_id=59\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Kodi Tutorial: Create Music Addon\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.bulis.co.uk\/#website\",\"url\":\"http:\/\/www.bulis.co.uk\/\",\"name\":\"Phantom Raspberry Blower\",\"description\":\"Blowing Raspberrys since 1989\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.bulis.co.uk\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-GB\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.bulis.co.uk\/?page_id=641","og_locale":"en_GB","og_type":"article","og_title":"Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower","og_description":"This tutorial will describe how to create a music addon for the popular Kodi media center. The addon we will be creating will recieve streams from the radio station Absolute Radio. Absolute Radio is one of the UK&#8217;s Independent National Radio stations. The station is based in London and plays popular rock music broadcasting on [&hellip;]","og_url":"http:\/\/www.bulis.co.uk\/?page_id=641","og_site_name":"Phantom Raspberry Blower","article_modified_time":"2018-10-29T16:12:39+00:00","og_image":[{"url":"http:\/\/www.bulis.co.uk\/wp-content\/uploads\/2018\/09\/absolute_radio.png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"53 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.bulis.co.uk\/?page_id=641","url":"http:\/\/www.bulis.co.uk\/?page_id=641","name":"Kodi Tutorial: Create Music Addon - Phantom Raspberry Blower","isPartOf":{"@id":"http:\/\/www.bulis.co.uk\/#website"},"datePublished":"2018-09-27T21:34:03+00:00","dateModified":"2018-10-29T16:12:39+00:00","breadcrumb":{"@id":"http:\/\/www.bulis.co.uk\/?page_id=641#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.bulis.co.uk\/?page_id=641"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.bulis.co.uk\/?page_id=641#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/www.bulis.co.uk\/"},{"@type":"ListItem","position":2,"name":"Tutorials","item":"http:\/\/www.bulis.co.uk\/?page_id=57"},{"@type":"ListItem","position":3,"name":"Kodi Tutorials","item":"http:\/\/www.bulis.co.uk\/?page_id=59"},{"@type":"ListItem","position":4,"name":"Kodi Tutorial: Create Music Addon"}]},{"@type":"WebSite","@id":"http:\/\/www.bulis.co.uk\/#website","url":"http:\/\/www.bulis.co.uk\/","name":"Phantom Raspberry Blower","description":"Blowing Raspberrys since 1989","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.bulis.co.uk\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-GB"}]}},"_links":{"self":[{"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/641"}],"collection":[{"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=641"}],"version-history":[{"count":4,"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/641\/revisions"}],"predecessor-version":[{"id":1440,"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/641\/revisions\/1440"}],"up":[{"embeddable":true,"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/59"}],"wp:attachment":[{"href":"http:\/\/www.bulis.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}