FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: setstate am 27 Mai 2016, 00:02:46

Titel: MPD Player Steuerung im FTUI
Beitrag von: setstate am 27 Mai 2016, 00:02:46
Heute bin ich endlich mit der Optimierung meiner MPD Player Steuerung zu einem vorzeigbaren Ergebnis gelangt.

Die Auswahl der Playlist passiert per Select Widget.
Das Cover wird durch ein normales Image Widget angezeigt.
Die aktuelle Position im Song wird mittels aktualisiertem Level Widget als Balken dargestellt. Dazu habe ich im FHEM MPD das INTERVAL auf 10 gestellt. Also aller 10 Sekunden ein Update der Position. Zusätzlich wird die Song-Gesamtzeit und die gespielte Dauer per Label Widget angezeigt.
Für die Steuerung nehme ich Switch und Push.
Für die Playlist nutze ich das neue 2.2 Widget Medialist .


<div data-type="medialist"
     data-device="MPD1"
     data-get="playlistinfo"
     data-pos="Pos"
     data-set="play"
     class="autoscroll">
</div>


Damit das Ganze fluffig läuft, musste ich das MPD Modul etwas optimieren. Meine Version ist unten mit angehangen. Da ich damit ausschließlich einen Mopidy Server mit Spotify-Plugin steuere und das mit dem originalen MPD Modul nicht 100% optimal klappte, habe ich die definierten Reading angepasst, die currentsong Abfrage bei Songwechsel verbessert und die Liste der Playlists in ein Reading gepackt, damit FTUI auch darauf zugreifen kann.
Das benötigte Reading für die Medialist und das Reading mit der URL für das Cover erzeuge ich in einigen 99_myUtils.pm Funktionen, die per BlockingCall in einen separaten Thread ausgelagert werden, um die weitere Ausführungen von FHEM nicht zu beeinträchtigen.

MPD Definition in der fhem.cfg

define MPD1 MPD xxx.xxx.xxx.xxx 6600
attr MPD1 devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
attr MPD1 event-on-update-reading state,Title,Track,playlistinfo,Album,Artist,playlistcollection,file,cover,playlist,Pos,Time,elapsed
attr MPD1 icon it_radio
attr MPD1 interval 10
attr MPD1 loadPlaylists 1
attr MPD1 room Wohnzimmer
attr MPD1 useIdle 0
attr MPD1 webCmd previous:stop:play:pause:next
# MPD Events
define OnMpdPlay notify MPD1:play {OnMpdPlayPressed()}
define OnMpdPlaylistChanged notify MPD1:playlist:.* {call_mpd1_playlistinfo()}
define OnMpdNewTrack notify MPD1:file:.* {call_mpd1_getcover()}


99_myUtils.pm Funktionen

sub call_mpd1_getcover() {
    Log 1, "call_mpd1_getcover";
    BlockingCall("mpd_getcover","MPD1","done_mpd1_getcover",60);
}

sub done_mpd1_getcover($) {
    my $url = shift;
    Log 1, "done_mpd1_getcover";
    fhem ("setreading MPD1 cover ".$url);
}

sub call_mpd1_playlistinfo() {
    Log 1, "call_mpd1_playlistinfo";
    BlockingCall("mpd_playlistinfo","MPD1","done_mpd1_playlistinfo",120);
}

sub done_mpd1_playlistinfo($) {
    my $playlist = shift;
    Log 1, "done_mpd1_playlistinfo";
    fhem ("setreading MPD1 playlistinfo ".$playlist);
}

sub mpd_playlistinfo($) {
  my $device = shift;
  my ($all) = fhem("get $device mpdCMD playlistinfo");
  $all =~ s/"/\\"/g; 
  my @artist = ($all=~/\nArtist:\s(.*)\n/g);
  my @title = ($all=~/\nTitle:\s(.*)\n/g);
  my @album = ($all=~/\nAlbum:\s(.*)\n/g);
  my @time = ($all=~/\nTime:\s(.*)\n/g);
  my @file = ($all=~/\nfile:\s(.*)\n/g);
  my @track = ($all=~/\nTrack:\s(.*)\n/g);
  my @albumUri = ($all=~/\nX-AlbumUri:\s(.*)\n/g);

  my $ret = '[';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $lastUri = '';
  my $url;

  for my $i (0 .. $#artist)
  {
     if ( $lastUri ne $albumUri[$i]) {
       my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$albumUri[$i]);
       my $data = '';
       if ( $response->is_success ) {
         $data = $response->decoded_content;
         $url = decode_json( $data );
         $lastUri = $albumUri[$i];
       }
     }

      $ret=$ret.'{"Artist":"'.$artist[$i].'",';
      $ret=$ret.'"Title":"'.$title[$i].'",';
      $ret=$ret.'"Album":"'.$album[$i].'",';
      $ret=$ret.'"Time":"'.$time[$i].'",';
      $ret=$ret.'"File":"'.$file[$i].'",';
      $ret=$ret.'"Track":"'.$track[$i].'",';
      $ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';

      if ($i<$#artist) {$ret=$ret.',';}
  }
  $ret =~ s/;//g;
  $ret =~ s/\\n//g;
  return $ret.']';
}

sub mpd_getcover($) {
  my $device = shift;
  my $file = ReadingsVal($device, 'file', '');
  my $url = 'na';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$file);
  my $data = '';
  if ( $response->is_success ) {
     $data = $response->decoded_content;
     $url = decode_json( $data )->{'thumbnail_url'};
  }
  return $url;
}

sub
OnMpdPlayPressed()
{
my $val=ReadingsVal('AvReceiver', 'input', 'Webradio');
if(($val ne 'SAT') && ($val ne 'BD/DVD') && ($val ne 'Game')) {
  fhem "set AvReceiver input Airplay";
}
fhem "get MPD1 playlists";
}


MPD Player mit Playlist im FTUI

<html>
<title>FHEM</title>
<head>
    <!--
     /* FHEM tablet ui */
     /*
     * second page
     *
     load this page via widget pagebutton

     <div data-type="pagebutton"   data-url="#index_music.html"
          data-load="#content2"    data-off-background-color="transparent"
          data-off-color="#606060" data-on-background-color="#606060"
          data-on-color="#222222"  data-active-pattern=".*#index_music.html"
          data-icon="fa-music"     class="prefetch top-space"></div>
    -->
</head>
<body>
  <div class="page" id="content2">
    <div class="gridster">
      <ul>
        <li data-row="1" data-col="2" data-sizex="5" data-sizey="6">
             <header>PLAYER</header>
                 <div data-type="image"
                          data-device="MPD1"
                          data-get="cover"
                          data-size='250'
                          class="row top-space">
                 </div>
                 <div class="row">
                     <div data-type="label" data-device="MPD1" data-get="elapsed" data-substitution="toMinFromSec()" class="inline middle"></div>
                     <div data-type="level" data-device="MPD1" data-get="elapsed" data-max="Time" data-width="280"   class="horizontal inline middle"></div>
                     <div data-type="label" data-device="MPD1" data-get="Time" data-substitution="toMinFromSec()" class="inline middle"></div>
                 </div>
                 <div class="row large thin top-space">
                     <div data-type="label" data-device="MPD1" data-get="Title" data-substitution="s/Or//g" class="bold"></div>
                     <div data-type="label" data-device="MPD1" data-get="Artist" class=""></div>
                 </div>
                 <div class="row top-space">
                     <div data-type="switch" data-device="MPD1" data-get="repeat" data-set="repeat"
                          data-icon="fa-repeat" data-background-icon="-"
                          data-on-color="white" data-off-color="gray"
                          data-get-on="1" data-get-off="0"
                          data-set-on="1" data-set-off="0" class="col-1-5">
                     </div>
                     <div data-type="push" data-device="MPD1"
                           data-icon="fa-step-backward" data-background-icon="-"
                           data-off-color="#fff" data-on-color="#aa6900"
                           data-set-on="previous" class="col-1-5 big">
                     </div>
                     <div data-type="switch"
                             data-device="MPD1"
                             data-states='["play","pause","stop"]'
                             data-set-states='["pause","play","play"]'
                             data-background-icon="fa-circle-thin"
                             data-background-colors='["white","white","white"]'
                             data-colors='["white","white","white"]'
                             data-icons='["fa-pause","fa-play","fa-play"]'
                             class="col-1-5 big">
                     </div>
                     <div data-type="push" data-device="MPD1"
                           data-icon="fa-step-forward" data-background-icon="-"
                           data-off-color="#fff" data-on-color="#aa6900"
                           data-set-on="next" class="col-1-5 big">
                     </div>
                     <div data-type="switch" data-device="MPD1" data-get="random" data-set="random"
                           data-icon="fa-random" data-background-icon="-"
                           data-on-color="white" data-off-color="gray"
                           data-get-on="1" data-get-off="0"
                           data-set-on="1" data-set-off="0" class="col-1-5">
                     </div>
               </div>
        </li>
        <li data-row="1" data-col="2" data-sizex="6" data-sizey="6">
             <header>PLAYLIST</header>
             <div data-type="select" data-device="MPD1" data-list="playlistcollection" data-get="playlistname" data-set="playlist" class="col-1-2" ></div>
             <div data-type="medialist" data-device="MPD1" data-get="playlistinfo" data-pos="Pos" data-set="play" class="top-space left-space autoscroll"></div>
        </li>
        <li data-row="7" data-col="2" data-sizex="11" data-sizey="3">
             <header>VOLUME</header>
             <div class="row">
                <div class="col-1-4">
                   <div data-type="label" class="inline w2x large">Bad</div>
                   <div data-type="switch" data-device="BadRadio" data-icon="fa-music" class="inline"></div>
                   <div data-type="select" data-device="AvReceiverZ2" data-items='["Airplay","Webradio","BD/DVD","PHONO"]' data-get="input" data-set="input" class="newline wider" ></div>
                </div>
                <div class="col-1-4">
                   <div data-type="label" class="inline w2x large">WZ</div>
                   <div data-type="switch" data-device="RadioAtTablet" data-icon="fa-music" class="inline"></div>
                   <div data-type="select" data-device="AvReceiver" data-list="inputs" data-get="input" data-set="input" class="newline wider" ></div>
                </div>
                <div class="col-1-4">
                    <div data-type="circlemenu" class="circlemenu">
                        <ul>
                          <li><div data-type="push" data-icon="fa-wrench"></div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level -6" data-icon="">-6</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level -2" data-icon="">-2</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level 0" data-icon="">0</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +3" data-icon="">2</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +9" data-icon="">9</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +C" data-icon="">12</div></li>
                        </ul>
                    </div>
                    <div data-type="label" class="top-space-2x">Subwoofer</div>
                </div>
                <div class="col-1-4">
                  <div data-type="volume" data-device='AvReceiver' data-get='volume' data-set='volume' class="large cell" ></div>
                  <div data-type="label" class="newline top-narrow wider cell">Volume</div>
                </div>
            </div>
        </li>
      </ul>
    </div>
   </div>
</body>
</html>

Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: aeronaut am 20 Juni 2016, 20:16:52
Das sieht ja wirklich bombastisch aus, Kompliment! Habe mich gleich mal rangesetzt, davon einiges für meinen Squeeze-Player nachzubauen.

Besonders interessant ist die Anzeige der aktuellen Position mit dem level-Widget. Das bekomme ich leider nicht hin.

Sind das 2.2er-spezifische Funktionen? Ich habe noch die "alte" Version.

lg
aeronaut
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: setstate am 20 Juni 2016, 20:41:06
ZitatDas sieht ja wirklich bombastisch aus, Kompliment!
Danke, danke - gefällt mir auch immer noch gut  ;)

Zitat
    Umrechung: Die Funktion toMinFromSec() habe ich in den MyUtils implementiert, aber die Methode wird nicht angesprungen

Das ist eine built-in ftui-js-funktion der 2.2. Muss also nicht in die myUtils.

ZitatMax-Wert: Was tut data-max="Time"? Die Berechnung scheint in meinem Fall nicht zu funktionieren. Der Max-Wert sollte ja der Maximallänge eines Songs entsprechen 

Da "Time" nicht numerisch ist, sucht er als nächstes bei den Readings des angegebenen Devices für die Berechnung der End-Position. "elapsed" heißt bei mir das Reading für die aktuelle Position


Internals:
   CHANGED
   DEF        xxx.xxx.xxx.xxx 6600
   DISC       1
   HOST       xxx.xxx.xxx.xxx
   INTERVAL   10
   MUTE       off
   NAME       MPD1
   NR         248
   PORT       6600
   PRESENT    1
   STATE      stop
   TYPE       MPD
   VERSION    MPD 0.19.0
   VOLUME     100
   Readings:
     2016-06-19 13:14:02   Album           HOPELESSNESS
     2016-06-19 13:14:02   AlbumArtist     ANOHNI
     2016-06-19 13:14:01   Artist          ANOHNI
     2016-06-19 13:14:02   Date            2016
     2016-06-19 15:45:58   Id              12565
     2016-06-19 15:45:58   Pos             8
     2016-06-19 15:45:57   Time            282
     2016-06-19 15:45:58   Title           Crisis
     2016-06-19 15:45:58   Track           9
     2016-06-19 13:14:02   X-AlbumUri      spotify:album:1S3OY2V2ZwFh4xU7gQG6IZ
     2016-05-25 14:18:18   artist
     2016-05-25 18:17:20   bitrate         320
     2016-05-25 18:17:19   consume         0
     2016-06-19 15:45:59   cover           https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4
     2016-06-19 15:47:09   elapsed         80.758
     2016-06-19 15:45:57   file            spotify:track:2YKuqElhfUQ8Oy6jD8ost1
     2016-05-25 16:29:53   mpd_event       changed: player
     2015-12-19 13:36:19   name            0
     2016-06-19 13:14:01   playlist        138
     2016-06-19 13:14:01   playlistcollection [Radio Streams]:50hits lounge:Indie classics (by alexv94):ANOHNI – HOPELESSNESS:PJ Harvey:Biffy Clyro – Opposites (Deluxe):Jack Garrat:ms-sampler 2016-spring:PEACE (by spotify):The Perfect Italian Dinner (by spotify):ms-sampler Tame Beatle:ms-sampler Xmas:Hipster House Party (by spotify):Top40-2015-12:Frank und seine Freunde – Die 44 beliebtesten Kinderlieder:AnnenMayKantereit – Wird schon irgendwie gehen:We The Generation (Deluxe Edition):Wanda – Bussi:Kele – Trick:Editors – IN DREAM:Kwabs – Love + War:Wanda – Amore:Foals – What Went Down:Paul Kalkbrenner – 7:The Maccabees – Marks To Prove It:Muse, Editors, The Killers (by jm.hoekstra):Feelgood Indie (by spotify_germany):J.D. McPherson – Let The Good Times Roll:POLIÇA – Shulamith (Expanded Edition):Leon Bridges – Coming Home:Everything Everything – Get To Heaven (Deluxe):Jamie xx – In Colour:Muse – Drones:Desmond Dekker – Super Best:Portugal. The Man – Evil Friends:Little Dragon – Machine Dreams:ms-sampler 2015:Cold War Kids – Hold My Home:Various Artists – 50 Hits Lounge:Various Artists – Made in Germany:The Prodigy – The Day Is My Enemy:Mumford & Sons – Wilder Mind (Deluxe):Bob Marley Top 30 (by finnur):Deichkind – Niveau Weshalb Warum:Bilderbuch – SCHICK SCHOCK:Why Make Sense? - A Hot Chip Discography (by hot_chip_official):Filmmusik (by spotify_germany):Piano Ballads (by spotify):House Relax (by spotify):Chillout Lounge (by spotify_germany):Pay Close Attention XL Recordings:Elektro Bike (by spotify_germany)
     2016-06-19 13:14:04   playlistinfo    [{"Artist":"ANOHNI","Title":"Drone Bomb Me","Album":"HOPELESSNESS","Time":"251","File":"spotify:track:2qIX2RvAbAvZ4VwGPmbhE3","Track":"1","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"4 DEGREES","Album":"HOPELESSNESS","Time":"232","File":"spotify:track:5ji7wOTLlcJ9uOM4hHcIOw","Track":"2","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Watch Me","Album":"HOPELESSNESS","Time":"207","File":"spotify:track:4wPlMbv1ikPypgeDqBCJvC","Track":"3","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Execution","Album":"HOPELESSNESS","Time":"218","File":"spotify:track:1yt1obxICqGpwt4jNiVlAi","Track":"4","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"I Don't Love You Anymore","Album":"HOPELESSNESS","Time":"300","File":"spotify:track:1kYh5B5YW5gU8XA21qzjlk","Track":"5","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Obama","Album":"HOPELESSNESS","Time":"251","File":"spotify:track:5YmqIz3AsKS6h8hIu4eqyA","Track":"6","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Violent Men","Album":"HOPELESSNESS","Time":"130","File":"spotify:track:0DVNd0ACJkymUl1BbuFCzc","Track":"7","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Why Did You Separate Me from the Earth?","Album":"HOPELESSNESS","Time":"216","File":"spotify:track:5SyBAbwn4GM6N3E71kUKfO","Track":"8","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Crisis","Album":"HOPELESSNESS","Time":"282","File":"spotify:track:2YKuqElhfUQ8Oy6jD8ost1","Track":"9","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Hopelessness","Album":"HOPELESSNESS","Time":"235","File":"spotify:track:4ivqCrlgfWX31azXG929ud","Track":"10","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Marrow","Album":"HOPELESSNESS","Time":"181","File":"spotify:track:3FJPWS8JYP7KHsY2g6PUkl","Track":"11","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"}]
     2016-06-19 13:14:01   playlistlength  11
     2016-06-19 13:14:01   playlistname    ANOHNI – HOPELESSNESS
     2016-06-10 22:37:23   random          0
     2016-05-25 18:17:19   repeat          0
     2016-05-25 18:17:19   single          0
     2016-06-19 15:45:57   song            8
     2016-06-19 15:45:57   songid          12565
     2016-06-19 15:47:22   state           stop
     2016-06-19 15:47:09   time            80:282
     2016-05-25 12:56:26   title
     2016-05-25 12:53:03   track           14
     2016-05-25 18:17:19   volume          100
     2016-05-25 18:17:19   xfade           0
Attributes:
   devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
   event-on-update-reading state,Title,Track,playlistinfo,Album,Artist,playlistcollection,file,cover,playlist,Pos,Time,elapsed
   icon       it_radio
   interval   10
   loadPlaylists 1
   room       Wohnzimmer
   useIdle    0
   webCmd     previous:stop:play:pause:next
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: aeronaut am 20 Juni 2016, 22:40:17
Dann werde ich mal warten, bis ich mich traue, auf die neue Version zu migrieren  :)  Läuft gerade alles so gut.

Bis auf den Progress und die Playlist-Ansicht ist auf jeden Fall alles auch super mit Squeeze darstellbar.

lg
aeronaut
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: setstate am 20 Juni 2016, 23:03:23
Aber hat dein Player keine Readings für 1.) Spiel-Dauer  und 2.) für die Song-Dauer  in Sekunden?

Für den Progress braucht man keine toMinFromSec() Funktion, da die beiden Werte sollten in Sekunden vorliegen. In Den Wert in Minuten braucht man nur für das Label. Ggf. kann man das auch mit einem Userreading realisieren.


                     <div data-type="label" data-device="PLAYER1" data-get="ur_playDurationInMinutes"  class="inline middle"></div>
                     <div data-type="level" data-device="PLAYER1" data-get="playDuration" data-max="songDuration" data-width="280"   class="horizontal inline middle"></div>
                     <div data-type="label" data-device="PLAYER1" data-get="ur_songDurationInMinutes" class="inline middle"></div>
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: aeronaut am 20 Juni 2016, 23:26:59
Ja stimmt, für die Labels reicht ein Userreading. Das wäre abgefrühstückt.

Readings:
2016-06-20 23:16:43   currentTrackPosition 212
2016-06-20 23:13:16   duration        277.053


Das klappt aber nicht:
<div data-type="level" data-device="sqb.wz"
data-get="currentTrackPosition" data-max="duration" data-width="200"
        class="horizontal inline middle"></div>


Vielleicht stört der Kommawert der Gesamtzeit.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: fricketo am 21 August 2016, 19:39:48
Moin setstate,

das sieht ja echt mal fett aus...und hätte ich direkt gesehen, dass schon jemand den MPD im FTUI hinzugefügt hat, hätte mein Wochenende wohl anders ausgesehen, da ich es seit Freitag krampfhaft probiere...(woran man wahrscheinlich erkennt, dass ich mich noch nicht allzu lange mit FHEM beschäftige).

Leider stoße ich aber auch beim Versuch deine Lösung zu übernehmen direkt am Anfang an meine Grenzen...du schreibst, du nutzt das Widget Media List...

...wo finde ich das??? :o :P

LG

Torsten
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: setstate am 21 August 2016, 19:45:33
Zitat von: fricketo am 21 August 2016, 19:39:48
...du schreibst, du nutzt das Widget Media List...

...wo finde ich das??? :o :P

LG

Torsten

Das FTUI Medialist Widget gibt es nur in der 2.2 (eval) Version von FTUI.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: fricketo am 21 August 2016, 20:44:06
na dann sollte ich mir die wohl mal anschauen...

Dank dir!!!
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: eazy_isi am 23 August 2016, 13:47:53
Hallo zusammen,

erst mal ein dickes LOB für die Integration von MPD in FTUI.
Gefällt mir super das ganze.
Selbst als blutiger Anfänger in FHEM und FTUI konnte ich das ganze ziemlich
schnell bei mir integrieren.
Allerdings scheitere ich an der Playlist im FTUI.
In FHEM kann ich meine Playlists auswählen. In Ftui nimmt er allerdings immer die in FHEM ausgewählte Playlist.
Wenn ich versuche eine Playlist auszuwählen, erhalte ich nur eine leeres Fenster.
Meine Playlist beschränkt sich bisher auf 5 Playlist files im mpd playlist Verzeichnis.
Das LOG in FHEM zeigt mir keine Fehler.
Allerdings wird das reading playlistinfo nur so [] angezeigt.

Und an dieser Stelle bin ich mit meinem kleinen Latein am Ende.

Wäre super wenn mir hier jemand auf die Sprünge helfen könnte.

Gruß
Thomas
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 07 September 2016, 10:59:18
Hi setstate,
ich bin auch dabei den MPD nach deinem Vorbild im FTUI umzusetzen, klappt auch soweit. Probleme gibt es bei der anzeige des Statusbalkens -> Level Widget. Der färbst sich nicht gemäß Fortschritt gelb ein. Die Zeitanzeige vorher (elapsed) und MaxTime klappt. Ich habe dein Beispiel exakt so übernommen.

Kannst du mir einen Hinweis geben??

<div data-type="label" data-device="MPD1" data-get="elapsed" data-substitution="toMinFromSec()" class="inline middle"></div>
                     <div data-type="level"
                       data-device="MPD1"
                       data-get="elapsed"
                       data-max="Time"
                       data-width="280"
                       class="horizontal inline middle">
                     </div>
                     <div data-type="label" data-device="MPD1" data-get="Time" data-substitution="toMinFromSec()" class="inline middle"></div>


Nochetwas ist mir aufgefallen: im MPD Modul, ein "set MPD1 interval 10" setz das intervall auf 10. Eine Änderung des Attributes "intervall" auf 10 hat allerdings keine Auswirkung nach FHEM-Neustart
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Stivmaster am 25 September 2016, 22:16:24
Hallo,

wie immer tolle Arbeit setstate, hat bei mir gleich auf Anhieb geklappt.

Eine bitte habe ich jedoch. Wenn ich mit dem Musicbox Webclient Radiostreams anlege, dann kann ich die in FHEM auch anwählen [Radio Streams]. Allerdings bekomme ich keine Auflistung, was alles beinhaltet ist. In meinem Fall ist da Antenne Bayern, Absolut Hot  und sunshine live hinterlegt. Das sind Tunein streams. wenn ich jetzt die Liste auswähle, hängt sich irgendetwas aus, wozu ich leider nicht in der Lage bin, herauszufinden was es ist.

Das wären die letzten Zeilen im Log:

2016.09.25 22:13:48 1: call_mpd1_getcover
2016.09.25 22:13:48 3: OnMpdNewTrack return value: HASH(0x750ce18)
2016.09.25 22:13:49 1: PERL WARNING: Use of uninitialized value in hash element at fhem.pl line 2340.
2016.09.25 22:13:49 1: done_mpd1_getcover
2016.09.25 22:14:08 1: PERL WARNING: Use of uninitialized value in string eq at fhem.pl line 4573.
2016.09.25 22:14:11 1: PERL WARNING: Use of uninitialized value in string eq at fhem.pl line 4573.

Ich muss Fhem neustarten , damit es wieder funktioniert.

Ich hab auch schon überlegt, ne eigene Playlist anzulegen, mit meinen Radiostationen, die ich möchte, allerdings habe ich da auch keinen Plan wie das funktioniert.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Stivmaster am 26 September 2016, 18:58:15
So, 2 Playlists angelegt, leider auch ohne erfolg. Gleiches Verhalten. FHEM schmiert ab.
Evtl. liegts an den fehlenden Album, Cover infomationen?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: setstate am 26 September 2016, 19:47:29
Keine Ahnung, wie ich dir da helfen könnte.
Man muss jetzt debuggen, an welcher Stelle welcher Wert vorliegt. Am besten mit Log arbeiten ...
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Stivmaster am 26 September 2016, 21:59:15
ich habs jetz so hinbekommen, dass es zumindest nicht mehr abstürzt.
Habe für jeden Stream ne eigene locale Playlist erstellt. Das fehlende Cover setzte ich mit einem DOIF, indem ich den Playlistnamen abfrage. Zudem setze ich das Reading für den Artist auf na.

So funktioniert es zumindest jetzt bei mir. Ist zwar wahrscheinlich die "schmutzigste" Lösung, aber es tut zumindest dass was es soll. Mal sehen ob es auch im Tagesbetrieb stabil läuft, aber dass werd ich dann schnell genug erfahren, wenn ich von der Arbeit heimkomm, und das gemecker dann wieder groß ist, wenn was nicht läuft.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Luigi am 27 September 2016, 16:02:04
@Tobias habe das gleiche Problem mit dem Fortschrittsbalken. Hast du eine Lösung gefunden?

Gruß
Luigi

Zitat von: Tobias am 07 September 2016, 10:59:18
Hi setstate,
ich bin auch dabei den MPD nach deinem Vorbild im FTUI umzusetzen, klappt auch soweit. Probleme gibt es bei der anzeige des Statusbalkens -> Level Widget. Der färbst sich nicht gemäß Fortschritt gelb ein. Die Zeitanzeige vorher (elapsed) und MaxTime klappt. Ich habe dein Beispiel exakt so übernommen.

Kannst du mir einen Hinweis geben??

<div data-type="label" data-device="MPD1" data-get="elapsed" data-substitution="toMinFromSec()" class="inline middle"></div>
                     <div data-type="level"
                       data-device="MPD1"
                       data-get="elapsed"
                       data-max="Time"
                       data-width="280"
                       class="horizontal inline middle">
                     </div>
                     <div data-type="label" data-device="MPD1" data-get="Time" data-substitution="toMinFromSec()" class="inline middle"></div>


Nochetwas ist mir aufgefallen: im MPD Modul, ein "set MPD1 interval 10" setz das intervall auf 10. Eine Änderung des Attributes "intervall" auf 10 hat allerdings keine Auswirkung nach FHEM-Neustart
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 28 September 2016, 09:44:18
Zitat von: Luigi am 27 September 2016, 16:02:04
@Tobias habe das gleiche Problem mit dem Fortschrittsbalken. Hast du eine Lösung gefunden?

Gruß
Luigi
Ja funzt jetzt...
                     <div data-type="level"
                       data-device="sonos_Wohnzimmer"
                       data-get="TrackPositionSec"
                       data-max="TrackDurationSec" data-min="0"
                       data-width="300"
                       class="horizontal tap inline middle">
                     </div>
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Photon68 am 02 Oktober 2016, 11:15:56
@Tobias:

Ich versuche die level-Anzeige mit meinem Sonos nachzubauen.
"TrackPositionSec" und "TrackDurationSec" sind zumindest bei mir keine Parameter beim Sonos.
Hast du eine Umrechnung  / Userreading dafür benutzt um "CurrentTrackPosition" in "TrackPosSec" umzurechnen?

@all
Hat es einer von Euch geschafft, seine Sonosplayliste (Titel, Cover, Spieldauer) mit dem Widget Medialist wie im Beispiel von setstate anzuzeigen? Wenn ja, wäre ich für einen Gedankenanstoss dankbar (z.B Verwendung von BookmarkTitlePlaylist etc.)


Gruß Photon68

Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Markus Hermann am 02 Oktober 2016, 11:46:25
@setstate:

Ich suche schon lange eine Möglichkeit meine MP3's mit einen hohem WAF über FHEM abzuspielen. Mir scheint Deine Einbindung des MPD in FTUI als beste Lösung. Ich möchte aber gerne, dass die Musik über meine MUNET PEAQ Lautsprecher (DLNA-Player) abgespielt wird. Das Abspielen von Radio-Streams klappt ja Dank Dominik's 98_DLNARenderer.pm  https://forum.fhem.de/index.php/topic,39706.0.html (https://forum.fhem.de/index.php/topic,39706.0.html) schon hervorragend. Nur wie kann ich dem MPD-Modul beibringen, das der Sound an den DLNARenderer geschickt wird? Ich habe schon versucht den output in der /etc/mdp.conf per Pulseaudio auszugeben, aber irgendwie scheiter ich an pulseaudio und pulseaudio-dlna.

Mein FHEM läuft zusammen mit MPD, miniDLNA und Subsonic auf einem Ubuntu-Server, der im Keller steht. Also ich möchte irgendwie erreichen, dass MPD die Musik per "push" auf einen DLNA-fähigen Player schickt bzw streamt. Mit BubbleUNP klappt es schon sehr gut, nur ist das wieder eine extra App und ich möchte wegen dem WAF, das Ganze lieber in FHEM unterbringen.

Hast Du oder jemand anderes einen Tipp für mich.

Gruß
Markus
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 04 Oktober 2016, 14:58:19
@photon68: sorry, die myutils Routine muss ich noch Posten. Die Integration in die medialist funktioniert problemlos. Sieht exakt wie im Eingangspost von setstate aus :)

Gesendet von meinem Leap mit Tapatalk

Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Photon68 am 04 Oktober 2016, 20:15:23
@Tobias

Dann würde es mich freuen, wenn du deine Routinen aus den myUtils posten würdest.
Bin gespannt. :)

Gruß Photon68
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 05 Oktober 2016, 19:59:55
Bitte sehr: 99_Utils_Sonos.pm
##############################################
# $Id:$
package main;

use strict;
use warnings;
use POSIX;

sub
Utils_Sonos_Initialize($$)
{
  my ($hash) = @_;
}


####################################
# https://github.com/ddtlabs/smartvisu-widgets/blob/master/sonos/99_fronthemSonosUtils.pm
# wird aufgerufen, wen sich der Status beim Sonos ändert
# PLAYING, STOPPED, PAUSED_PLAYBACK
####################################
sub Utils_Sonos_TransportStateChanged ($$) {
  my ($device, $event) = @_;
  Utils_Sonos_GetTrackPos($device,$event);
  return undef;
}


sub Utils_Sonos_GetTrackPos($$) {
  my ($device,$evt) = @_;

  my $atName = "at_".$device."_GetTrackPos";
  my $room = "hidden";

  Log3 undef, 4, "Utils_Sonos_SonosGetTrackPos: device: " . $device . " / currentTrackProvider: " . ReadingsVal($device, 'currentTrackProvider','ERROR') . " / currentStreamAudio: " . ReadingsVal($device, "currentStreamAudio","ERROR");
  if (($evt eq "PLAYING") && (ReadingsVal($device, 'currentTrackProvider','') !~ /Gruppenwiedergabe/) && (ReadingsVal($device, 'currentStreamAudio','1') eq 0))
  {
    Utils_Sonos_defineAtTimer($device);
  }
  else
  {
    Utils_Sonos_deleteAtTimer($device);
  }
}

sub Utils_Sonos_defineAtTimer($) {
  my ($device) = @_;

  my $atName = "at_".$device."_GetTrackPos";
  my $room = "hidden";
  my $atSec = "05";

  if (ReadingsVal($atName, "state", "doNotExist") eq "doNotExist")
  {
    Log3 undef, 4, "Utils_Sonos_defineAtTimer: defmod ".$atName." at +*00:00:" . $atSec . " {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}";
    fhem("sleep 0.01; {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}");
    fhem("defmod -temporary ".$atName." at +*00:00:" . $atSec . " {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}");
    fhem("attr ".$atName." room ".$room);
  }
  return undef;
}

sub Utils_Sonos_deleteAtTimer($) {
  my ($device) = @_;
  my $atName = "at_" . $device . "_GetTrackPos";

  if (ReadingsVal($atName, "state", "doNotExist") ne "doNotExist")
  {
    Log3 undef, 4, "Utils_Sonos_deleteAtTimer($device): " . "delete $atName";
    fhem("delete $atName");
  }
}


# ####################################################################
# sv_calcTrackPosPercent()      ($LastActionResult = eg. GetCurrentTrackPosition: 0:00:11)
# ####################################################################

sub Utils_Sonos_SonosTrackPositionUpdate($) {
  my ($device) = @_;
  fhem("get $device CurrentTrackPosition");

  my $trackPosP;
  my $trackPosS;
  my $trackDurS;
  my $trackPosT = ReadingsVal($device, "currentTrackPosition", "0:00:10");
  my $trackDurT = ReadingsVal($device, 'currentTrackDuration', '0:01:00');

  if (($trackDurT eq "0:00:00") || ($trackDurT eq "NOT_IMPLEMENTED") || ($trackDurT eq "")) # last is a test
  {
    $trackPosP = 0;
  }
  else
  {
    $trackDurS = SONOS_GetTimeSeconds($trackDurT);
    $trackPosS = SONOS_GetTimeSeconds($trackPosT);

    # update is too late, we are one step beyond...
    $trackPosP = int(100 * $trackPosS / (0.1 + $trackDurS));
    if ($trackPosP >= 100) {$trackPosP = 100}  # $trackDurS = 0
  }

  readingsBeginUpdate($defs{$device});
  readingsBulkUpdate($defs{$device}, "TrackPositionSec", $trackPosS);
  readingsBulkUpdate($defs{$device}, "TrackPositionPct", $trackPosP);
  readingsBulkUpdate($defs{$device}, "TrackDurationSec", $trackDurS) if($trackDurS != ReadingsVal($device, 'TrackDurationSec', '0'));
  readingsEndUpdate($defs{$device}, 1);

  #Log3 undef, 4, "Utils_Sonos_SonosTrackPositioUpdate($device): setreading $device Utils_Sonos_TrackPosition $trackPosP";
  #my @c = Utils_Sonos_SonosGetSlaves($device);  # include slaves
  #push(@c, $device);           # include device itself
  #foreach my $client (@c) {
    #Log3 undef, 4, "Utils_Sonos_SonosTrackPositioUpdate($device): setreading $clientTrackPositionSec $trackPosP";
    #fhem("sleep 0.01; setreading $client TrackPositionPct $trackPosP ");
  #}

  return undef;
}


1;
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Photon68 am 06 Oktober 2016, 11:19:22
Danke Tobias! ;D

Leider stehe ich trotzdem auf dem Schlauch, was die Playlist wie im Beispiel von setstate und den Fortschrittsbalken betrifft:

1. Ich habe die 99_Sonos-Utilities in FHEM angelegt.
2. Muss ich MDP auf dem Raspberry istallieren, auch wenn ich eigentlich nur die Playlisten vom SONOS darstellen will?
3. Muss ich die 99_fronthemSonosUtils.pm auch in FHEM anlegen?

Gruß und Dank Photon68
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 06 Oktober 2016, 12:12:06
2: nein, 3: nein
Aber du musst irgendwo die playliste generieren lassen.
Ich lasse sie automatisch generieren aus dem Filesystem

Gesendet von meinem Leap mit Tapatalk
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Photon68 am 06 Oktober 2016, 21:12:55
Danke Tobias!
Dann probier ich mal, ob ich die Playliste aus den bookmarks bekomme.

Gruß Photon68
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: mafe68 am 12 Oktober 2016, 17:20:36
Hallo!

Mal danke für deine Mühe das du so ein Projekt gemacht hast. Nun zu meinem Problem. Ich möchte mir deinen Player nachbauen und habe auch die fhem.cfg, 99_myUtils.pm  und index.html erstellt so wie du sie beschrieben hast. Nur wenn ich dann auf Tablet-UI klicke bekomme ich nur diese Zeilen untereinander angezeigt


    PLAYER
    PLAYLIST
    VOLUME
    Bad
    WZ
        -6
        -2
        0
        2
        9
        12
    Subwoofer
    Volume


Und im Log finde ich folgenden Fehler
2016.10.12 17:02:26 1: PERL WARNING: Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 15.
kann aber so nichts auffälligen im skipt finden.
Hast du vielleicht einen Tipp für mich?
Hier auch noch die 99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.


sub call_mpd1_getcover() {
    Log 1, "call_mpd1_getcover";
    BlockingCall("mpd_getcover","MPD1","done_mpd1_getcover",60);
}

sub done_mpd1_getcover($) {
    my $url = shift;
    Log 1, "done_mpd1_getcover";
    fhem ("setreading MPD1 cover ".$url);
}

sub call_mpd1_playlistinfo() {
    Log 1, "call_mpd1_playlistinfo";
    BlockingCall("mpd_playlistinfo","MPD1","done_mpd1_playlistinfo",120);
}

sub done_mpd1_playlistinfo($) {
    my $playlist = shift;
    Log 1, "done_mpd1_playlistinfo";
    fhem ("setreading MPD1 playlistinfo ".$playlist);
}

sub mpd_playlistinfo($) {
  my $device = shift;
  my ($all) = fhem("get $device mpdCMD playlistinfo");
  $all =~ s/"/\\"/g;
  my @artist = ($all=~/\nArtist:\s(.*)\n/g);
  my @title = ($all=~/\nTitle:\s(.*)\n/g);
  my @album = ($all=~/\nAlbum:\s(.*)\n/g);
  my @time = ($all=~/\nTime:\s(.*)\n/g);
  my @file = ($all=~/\nfile:\s(.*)\n/g);
  my @track = ($all=~/\nTrack:\s(.*)\n/g);
  my @albumUri = ($all=~/\nX-AlbumUri:\s(.*)\n/g);

  my $ret = '[';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $lastUri = '';
  my $url;

  for my $i (0 .. $#artist)
  {
     if ( $lastUri ne $albumUri[$i]) {
       my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$albumUri[$i]);
       my $data = '';
       if ( $response->is_success ) {
         $data = $response->decoded_content;
         $url = decode_json( $data );
         $lastUri = $albumUri[$i];
       }
     }

      $ret=$ret.'{"Artist":"'.$artist[$i].'",';
      $ret=$ret.'"Title":"'.$title[$i].'",';
      $ret=$ret.'"Album":"'.$album[$i].'",';
      $ret=$ret.'"Time":"'.$time[$i].'",';
      $ret=$ret.'"File":"'.$file[$i].'",';
      $ret=$ret.'"Track":"'.$track[$i].'",';
      $ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';

      if ($i<$#artist) {$ret=$ret.',';}
  }
  $ret =~ s/;//g;
  $ret =~ s/\\n//g;
  return $ret.']';
}

sub mpd_getcover($) {
  my $device = shift;
  my $file = ReadingsVal($device, 'file', '');
  my $url = 'na';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$file);
  my $data = '';
  if ( $response->is_success ) {
     $data = $response->decoded_content;
     $url = decode_json( $data )->{'thumbnail_url'};
  }
  return $url;
}

sub
OnMpdPlayPressed()
{
my $val=ReadingsVal('AvReceiver', 'input', 'Webradio');
if(($val ne 'SAT') && ($val ne 'BD/DVD') && ($val ne 'Game')) {
  fhem "set AvReceiver input Airplay";
}
fhem "get MPD1 playlists";
}


1;
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: fretti am 06 Dezember 2016, 20:12:15
Ich habe auch mal den Teil für FHEM-WEB nachgebaut. FTUI soll noch folgen.

Ich möchte hauptsächlich MP3 aus einem Verzeichnis abspielen, für jedes Verzeichnis gibt es eine playlist im MPD-Playlist-Verzeichnis, das funktioniert auch soweit, ich kann die Playlist auswählen, abspielen, wechseln usw.

Was mich etwas stört/verwundert, alle 10 Sekunden habe ich folgendes im logfile

2016.12.06 20:04:40 1: call_mpd_playlistinfo
2016.12.06 20:04:40 1: done_mpd_playlistinfo


und die readings von playlist, playlistinfo, file werden aktualisiert.

Und ich weiß nicht warum das passiert, auch wenn sich die aktuelle Playlist nicht ändert?

PS: Habs gefunden, intervall 10
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: grossmaggul am 14 Dezember 2016, 10:08:05
Hallo,

tolle Sache das!

Ich versuche das gerade bei mir einzubauen, es funktioniert einiges, anderes noch nicht, da ich leider eine Perlniete bin stehe ich da teilweise etwas auf dem Schlauch.
Wo kann man angeben, wieviele Items der Playliste in der UI angezeigt werden?(habe ich inzwischen rausbekommen)
Die Select-Box zeigt weder meine Playlisten an, noch kann ich eine PL auswählen.
Außerdem wird das Cover nicht angezeigt, im Reading steht immer nur na.

Vielleicht kann mich jemand in die richtige Richtung schubsen.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Bootscreen am 16 Dezember 2016, 09:04:34
Moin @setstate

dank dir für diese wunderbare Umsetzung :D
könntest du dich mit @Wzut mal in Verbindung setzen? Er scheint nämlich derzeit auch ein wenig an seinem Modul zu arbeiten und es wäre schön wenn ihr das irgendwie zusammenfügt. Wäre schade wenn er ein Update raus bringt und dann unser FTUI MPD nicht mehr so will wie es soll ^^
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: grossmaggul am 18 Dezember 2016, 16:48:16
Irgendwie bekomme ich die Coverarts nicht, muß man dafür einen Spotifyaccount haben?

Mir scheint irgendetwas mit der URL nicht zu klappen, das hier erscheint im Log


2016.12.18 16:46:09 1: call_mpd1_playlistinfo
2016.12.18 16:46:09 3: OnMpdPlaylistChanged return value: HASH(0x3dd3470)
2016.12.18 16:46:09 3: get MPD1 mpdCMD playlistinfo : MPD1 playlistinfo:
file: T.Rex/20th Century/Children Of The Revolution.mp3
Last-Modified: 2011-04-28T15:33:15Z
Time: 149
Artist: T.Rex
Title: Children Of The Revolution
Album: 20th Century
Date: 1972
Genre: Glam Rock
Pos: 0
Id: 0
....


2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in string ne at ./FHEM/99_myUtils.pm line 65.
2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/99_myUtils.pm line 81.
2016.12.18 16:38:09 1: call_mpd1_getcover
2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/99_myUtils.pm line 80.
2016.12.18 16:38:09 3: OnMpdNewTrack return value: HASH(0x3dd3950)
2016.12.18 16:38:10 1: done_mpd1_playlistinfo
2016.12.18 16:38:11 1: done_mpd1_getcover


Line 65 enthält:

if ( $lastUri ne $albumUri[$i]) {

Line 80/81 enthalten:

$ret=$ret.'"Track":"'.$track[$i].'",';
$ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';


Irgendjemand eine Idee?

Marc-Antón

P.S. Nochwas, lässt sich das Logging auch irgendwo abschalten?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: TWART016 am 27 Dezember 2016, 00:47:26
Ich benutzer den Fully Browser mit Medialist. Nach unten scrollen funktioniert, nach oben nicht, weil die Seite dann neu lädt. Kann man da am Widget was optimieren, oder ist das ein Problem vom Browser?

Ist es möglich eine Suche einzubauen, welche nach Titel oder Künstler sucht?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: TWART016 am 27 Dezember 2016, 00:49:49
Zitat von: TWART016 am 27 Dezember 2016, 00:47:26
Ich benutzer den Fully Browser mit Medialist. Nach unten scrollen funktioniert, nach oben nicht, weil die Seite dann neu lädt. Kann man da am Widget was optimieren, oder ist das ein Problem vom Browser?
EDIT: eine Scrollleiste an der Seite ist bei Fully nicht vorhanden.

Ist es möglich eine Suche einzubauen, welche nach Titel oder Künstler sucht?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: setstate am 27 Dezember 2016, 15:23:55
Eine Suchfunktion brauche ich auch noch und werde das auch demnächst angehen. Aber das MPD Protokoll kennt keine generische Suchfunktion. Ich werde dafür die Spotify-Web API nutzen: https://developer.spotify.com/web-api/search-item/

UPDATE
Soweit mein Zwischenstand für die Albumsuche. Suche per Input-Widget und ich zeige das Ergebnis in einer Medialist an. Das Anklicken eines Albums zum Abspielen geht noch nicht. Dazu muss ich noch eine Änderung im Medialist-Widget machen. Vorerst muss man noch "set MPD1 playfile spotify:album:xyz123yxz123" eingeben.

sub call_mpd1_searchSpotify() {
    Log 1, "call_mpd1_searchSpotify";
    my $query = ReadingsVal("MPD1","searchquery","");
    BlockingCall("mpd_searchSpotify",$query,"done_mpd1_searchSpotify",120);
}

sub done_mpd1_searchSpotify($) {
    my $result = shift;
    Log 1, "done_mpd1_searchSpotify";
    fhem ("setreading MPD1 searchresult ".$result);
}

sub mpd_searchSpotify($) {
  my $query = shift;
  my $url;
  my $ret = '[';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );

  my $response = $ua->get("https://api.spotify.com/v1/search?q=artist:".$query."&type=album");
  my $data = '';
  if ( $response->is_success ) {
      $data = $response->decoded_content();
      my $result = decode_json( $data );
      my @items = @{$result->{albums}->{items}};
      my $count = 0;

     foreach my $album (@items )
     {
     if ( $album->{album_type} eq "album" ) {
       $ret=$ret.'{"Artist":"'.$album->{artists}[0]->{name}.'",';
       $ret=$ret.'"Title":"'.$album->{name}.'",';
       $ret=$ret.'"Album":"'.$album->{name}.'",';
       $ret=$ret.'"Time":"0",';
       $ret=$ret.'"File":"'.$album->{uri}.'",';
       $ret=$ret.'"Track":"'.$count.'",';
       $ret=$ret.'"Cover":"'.$album->{images}[2]->{url}.'"},';
       $count++;
     }
   }
   if ( $count > 0 ) {
      $ret = substr($ret, 0, -1);   
   }
}
 
  $ret =~ s/;//g;
  $ret =~ s/\\n//g;
  $ret =~ s/[\x80-\x{FFFF}]/\x5F/g;
  $ret = $ret.']';
  return $ret;
}



define OnMpdSearchChanged notify MPD1:searchquery:.* {call_mpd1_searchSpotify()}

FTUI

            <div data-type="input" data-device="MPD1" data-get="searchquery" data-set="searchquery" data-cmd="setreading" data-value="" class=""></div>
             <div data-type="medialist" data-device="MPD1" data-get="searchresult" class=""></div>
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: ThorstenHeidelberger am 30 Dezember 2016, 00:11:08
Hallo setstate, das ist wirklich ein cooles Modul. Vielen Dank dafür.
Ich habe nur das Problem, dass in kürzester Zeit mein FHEM-Log vollgeschrieben wird.
Alles paar Sekunden kommen Einträge in der Art:

2016.12.30 00:05:35 0: done_mpd1_getcover
2016.12.30 00:05:42 0: done_mpd1_playlistinfo
2016.12.30 00:05:44 0: call_mpd1_playlistinfo
2016.12.30 00:05:44 3: OnMpdPlaylistChanged return value: HASH(0x3a82fd0)
2016.12.30 00:05:44 3: get MPD1 mpdCMD playlistinfo : MPD1 playlistinfo:
file: spotify:track:69l8nFPu0LWmnoJX7YSVYc
Time: 269
Artist: James Taylor
Album: Mud Slide Slim And The Blue Horizon
Title: You've Got A Friend
Date: 1971
Track: 2
Pos: 0
Id: 69
AlbumArtist: James Taylor
X-AlbumUri: spotify:album:0h8hazllDADHsrSpcQCltk
file: spotify:track:2DnJjbjNTV9Nd5NOa1KGba


Kann ich das Logging für die Playlist-Info irgendwie deaktivieren?

Viele Grüße,
Thorsten
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 30 Dezember 2016, 20:53:13
Da Tobias mich heute im MPD Fred auf das Thema hier aufmerksam gemacht hat :

Zitat von: setstate am 27 Mai 2016, 00:02:46
Damit das Ganze fluffig läuft, musste ich das MPD Modul etwas optimieren.
--snip --
das mit dem originalen MPD Modul nicht 100% optimal klappte, habe ich die definierten Reading angepasst, die currentsong Abfrage bei Songwechsel verbessert und die Liste der Playlists in ein Reading gepackt, damit FTUI auch darauf zugreifen kann.

Was wird denn genau für FTUI gebraucht ?
Verstanden habe ich bis jetzt nur ein Reading mit dem Namen playlistcollection , d.h. eine Liste der vorhanden Playlisten mit Doppelpunkt getrennt ( ist ab morgen im Update verfügbar, aber war da nicht erst vor kurzem hier eine Diskussion das bestimmte Zeichen u.a. auch der Doppelpunkt nichts mehr in Reading Werten zu suchen haben ? .... muss ich jetzt direkt nochmal auf die Suche gehen)
Welche weiteren Readings werden noch benötigt ?
Was ist bei der current Songabfrage nicht OK ?
Reading cover : was wollt ihr hier haben - eine URL zum Bild des Interpreten ? Wenn ja ist im Reading  artist_image_html vorhanden, wenn es unbedingt cover sein muss kann ich es ändern bzw. man biegt es sich mit userreading selbst hin.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 04 Januar 2017, 16:54:50
So, jetzt nochmal zusammengefasst nachdem ich 2 Tage das aktuelle MPD-Modul versuche in TabletUI zu integrieren

- es muss in einem zu definierenden Intervall kontinuierlich das Reading "elapsed" aktualisiert werden. Angabe in Sekunden
- Reading "songtime" sollte ebenfalls die Anzahl in Sekunden der aktuellen Songlänge beinhalten
- "seekcur" aus dem MPD sollte noch ins Modul, damit man x-sekunden  vor- und zurückspulen kann
- Ein Reading "currentTrackProvider" sollte verfügbar sein. Dieser sollte folgende Ausprägungen haben
    - Radio: Ein Radiostream wird abgespielt
    - Bibliothek: Eine lokale MP3 wird abgespielt
- In ein Reading zb.: "playlist_json" wird von extern eine playlistdefinition, passend zur gleich abgespielten Playlist, eingesteuert. Darin befindet sich auch pro Track das passende Cover. Falls dieses Reading befüllt ist, sollte unter "artist_image" das daraus extrahierte Cover zum aktuell laufenden Track liegen
- der MPD stellt selbst kein "mute" zur Vefügung. Das könnte aber im MPD-fhem-Modul simuliert werden. Bei Mute: Volume merken und setvol=0, beim unmute entsprechend anders herum
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 04 Januar 2017, 17:47:25
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- es muss in einem zu definierenden Intervall kontinuierlich das Reading "elapsed" aktualisiert werden. Angabe in Sekunden
Ist in der aktuellen Version enthalten, wird parametriert über das attr waits und wirkt wenn der Status Play ist.

Zitat von: Tobias am 04 Januar 2017, 16:54:50
- Reading "songtime" sollte ebenfalls die Anzahl in Sekunden der aktuellen Songlänge beinhalten
songtime war eine Notlösung für das doppelte Time/time Reading. Nachdem das MPD Modul die Reading Namen 1:1 vom MPD verwendet gibt es dafür keinen Grund mehr. setstate ist in seinem Beispiel im ersten Post auch diesen Weg gegangen.

Zitat von: Tobias am 04 Januar 2017, 16:54:50
- "seekcur" aus dem MPD sollte noch ins Modul, damit man x-sekunden  vor- und zurückspulen kann
Auf der ToDo Liste

Zitat von: Tobias am 04 Januar 2017, 16:54:50
Ein Reading "currentTrackProvider" sollte verfügbar sein. Dieser sollte folgende Ausprägungen haben
    - Radio: Ein Radiostream wird abgespielt
    - Bibliothek: Eine lokale MP3 wird abgespielt
Die Unterscheidung ist heute schon möglich mit dem Reading "Name", wer das Kind unbedingt "currentTrackProvider" nennen will kann dies IMHO mitttels userReadings tun.

Zitat von: Tobias am 04 Januar 2017, 16:54:50
- In ein Reading zb.: "playlist_json" wird von extern eine playlistdefinition, passend zur gleich abgespielten Playlist, eingesteuert. Darin befindet sich auch pro Track das passende Cover. Falls dieses Reading befüllt ist, sollte unter "artist_image" das daraus extrahierte Cover zum aktuell laufenden Track liegen
Habe ich nun verstanden, die Umsetzung im Modul ist mir z.Z. aber noch unklar.
a. sehe ich da ein Timing Problem im Ablauf, da diese externe Info mit Sicherheit erst eintrifft wenn die Readings nach einem Song Wechsel bereits längst aktualisiert sind.
Ich werde das testen, allerdings muss der User dann auf den bequemen Weg verzichten die Bilder von Last.fm zu holen bzw. zu benutzen.
b. Unklar ist mir wie dein Modul 98_Medialist die exakte Zuordung Bild zu Song hinbekommt. Oder ist das pure Fleiß und Handarbeit ?
c. Sollte man darüber nachdenken das es sowohl Interpreten Bilder gibt = "artist_image" als auch Cover Bilder des Mediums LP/CD = "album_image".
Das MPD Modul kann beides dem User via Last.fm zur Verfügung stellen. Das medialist Widget kennt da heute leider nur ein Bild pro Song.

Zitat von: Tobias am 04 Januar 2017, 16:54:50
- der MPD stellt selbst kein "mute" zur Vefügung. Das könnte aber im MPD-fhem-Modul simuliert werden. Bei Mute: Volume merken und setvol=0, beim unmute entsprechend anders herum
da halte ich mich an :
Zitat von: Markus Bloch am 04 Januar 2017, 16:34:56
Schau mal hier: https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos
Wäre cool, wenn du diese Syntax ebenfalls verwenden könntest für den Mute-Befehl. (on/off/toggle).
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 05 Januar 2017, 08:55:49
Zitat von: Wzut am 04 Januar 2017, 17:47:25
songtime war eine Notlösung für das doppelte Time/time Reading. Nachdem das MPD Modul die Reading Namen 1:1 vom MPD verwendet gibt es dafür keinen Grund mehr. setstate ist in seinem Beispiel im ersten Post auch diesen Weg gegangen.
das aktuelle time enthält bei mir: "<elapsed>:<songtime>
Edit: Gefunden: ist "Time". das "time" enthält beides.

Zitat von: Wzut am 04 Januar 2017, 17:47:25
Die Unterscheidung ist heute schon möglich mit dem Reading "Name", wer das Kind unbedingt "currentTrackProvider" nennen will kann dies IMHO mitttels userReadings tun.

In TabletUI ist es schwer zu prüfen ob ein REading leer oder mit eigendetwas gefüllt ist. ODer ich stell mich zu dumm an. Wenn du es also nicht als wichtig erachtest muss man ein Userreading anlegen ;)

Nachtrag: Problem ist, das das Reading "Name" bei einem Wechsel von Radio zu lokaler mp3 keinen EventTrigger bekommt. Damit wird dann das Userreading nicht angeschubst. Kannst du gut im Eventmonitor prüfen das da nix ankommt... Das Userreading müsste heißen: currentTrackProvider:Name.* {if(ReadingsVal("$name", "Name", "") eq "") {"Bibliothek"} else {"Radio"}}

Nachtrag2: Man kann das Reading "mpd_event" nutzen, im Falle lvon lokalen Dateien ist die Ausprägung "player", bei Radio ist es "playlist". Damit gehts nun

Zitat von: Wzut am 04 Januar 2017, 17:47:25
Habe ich nun verstanden, die Umsetzung im Modul ist mir z.Z. aber noch unklar.
a. sehe ich da ein Timing Problem im Ablauf, da diese externe Info mit Sicherheit erst eintrifft wenn die Readings nach einem Song Wechsel bereits längst aktualisiert sind.
Ich werde das testen, allerdings muss der User dann auf den bequemen Weg verzichten die Bilder von Last.fm zu holen bzw. zu benutzen.
b. Unklar ist mir wie dein Modul 98_Medialist die exakte Zuordung Bild zu Song hinbekommt. Oder ist das pure Fleiß und Handarbeit ?
c. Sollte man darüber nachdenken das es sowohl Interpreten Bilder gibt = "artist_image" als auch Cover Bilder des Mediums LP/CD = "album_image".
Das MPD Modul kann beides dem User via Last.fm zur Verfügung stellen. Das medialist Widget kennt da heute leider nur ein Bild pro Song.
Zuerst wird die playlist_json übergeben, dann ein "set <MPD> playlist <playlistname>" aufgerufen. Die Reihenfolge in der <playlistname> stimmt exakt mit dem playlist_json überein.
Somit steht der json string schon bereit wenn ein "set playlist" erfolgt
Bzgl der Cover: Es wird artist und album eines jeden songs ermittelt und dann zurZeit in 3 verschiendenen Quellen /Coverdatenbanken nach vorhandenen Covern gesucht. Wenn im selben lokalen Folder wie die MP3s aus der Playlist aber auch ein Cover liegt, wird dieses genutzt. Das will und kann ich aber noch verfeinern. Das hinzufügen von weiteren http Quellen ist ziemlich einfach.
Am besten das Cover liegt neben deinen in einem extra Reading. Dann kann man schön das Rotor Widget nutzen um in TabletUI automatisch zwischen den Covern zu wechseln und beide anzuzeigen.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 11 Januar 2017, 20:58:19
Update :
currentTrackProvider ist ab morgen verfügbar
playlistinfo hat nun auch bei Radiostreams einen Inhalt
album_image , wenn Album einen Inhalt hat (i.d.R. nicht bei Radiostreams)
ToDo:
playlist_json auswerten
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 13 Januar 2017, 13:51:39
Vielen Dank,
CurrentTrackProvider funktioniert :)

Für dich als INfo oder Anregung fürs ToDo:
ich habe folgendes Userreading drin um die aktuelle Position in der aktuell abzuspielenden Playlist zu haben:
PlaylistPositionSec:elapsed.* {Utils_MPD_PlaylistPosition($NAME)}
# ####################################################################
# berechnet die aktuelle Position in der Playlist
# ####################################################################

sub Utils_MPD_PlaylistPosition($) {
  my ($device) = @_;
  return if(ReadingsVal($device, "mpd_event", "playlist") eq "playlist"); #Radiostream
 
  my $trackPosS = ReadingsVal($device, "elapsed", "0");
  my $plPosS = 0; #PlaylistPositionSeconds
  my $Track     = ReadingsVal($device, "Pos", "0");
  my $playlist  = ReadingsVal($device, "playlist_json", undef);
 
  my @data      = @{JSON::XS->new->decode($playlist)} if($playlist);
 
  #calculate elapsed time of whole playlist
  if($playlist) {
    for(my $j=0; $j<=$#data; $j++) {
      last if($j>=$Track);
      $plPosS += $data[$j]->{Time};
    }
  }
  $plPosS += $trackPosS;
 
  return $plPosS;
}


Somit habe ich nicht nur eine laufende Fortschrittsanzeige in TabletUI über den aktuellen TRack, sondern auch über eine laufende Fortschrittsanzeige über die gesamtSpielzeit
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 14 Januar 2017, 18:24:11
Zitat von: Tobias am 05 Januar 2017, 08:55:49
Nachtrag2: Man kann das Reading "mpd_event" nutzen, im Falle lvon lokalen Dateien ist die Ausprägung "player", bei Radio ist es "playlist".
und
return if(ReadingsVal($device, "mpd_event", "playlist") eq "playlist"); #Radiostream
Ich denke hier liegst du nur zum Teil richtig , der event playlist wird laut MPD Doku erzeugt , wenn :
Zitatplaylist: the current playlist has been modified
Sicher das trift bei Radoistreams immer dann zu wenn sie den Titel Tag ändern, sei es weil ein neues Lied beginnt oder die Station andere Nachrichten verschickt.
Aber auch beim abspielen deiner eigenen Musik gibt es diesen Event, mit Sicherheit z.B. beim wechseln der Playliste.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 14 Januar 2017, 20:00:47
Ja, hab ich auch schon gemerkt, wen ich zb. volume ändere, ist das mpd_event = mixer.
Zum Glück hast du es ja jetzt korrekt eingebaut :)
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: fremitus am 05 Februar 2017, 01:00:54
Hallo zusammen,

leider gelingt es mir nicht, das Medialist Modul zu laden. Wer kann helfen:

reload: Error:Modul 98_MediaList deactivated:
Can't locate MP3/Tag.pm in @INC (you may need to install the MP3::Tag module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl ./FHEM) at ./FHEM/98_MediaList.pm line 35, <$fh> line 69.
BEGIN failed--compilation aborted at ./FHEM/98_MediaList.pm line 35, <$fh> line 69.


gruss Peer
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 06 Februar 2017, 09:36:47
@fremitus,
ich habe das Modul noch nicht freigegeben da die Commandref-Doku noch fehlt. Funktionalität ist aber da, wird bei mir täglich getestet ;)
Ich häng dir mal die aktuelle Version hier an

Wikieintrag gibt schon, auch die benötigten Module: https://wiki.fhem.de/wiki/MediaList
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: fremitus am 06 Februar 2017, 19:54:19
Danke, hat geholfen. Allerdings sieht es auf meinem 3.5 Display doch etwas schräg aus...das muss ich mir noch etwas anderes einfallen lassen.
Und Asche auf mein Haupt, ich habe ca. 4h im Internet recherchiert und bin auch über deine Anleitung gestolpert...nur die Installationsanweisung habe ich irgendwie übersehen....

gruss Peer
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 07 Februar 2017, 10:48:17
Hab den Wikiartikel nochmal stark überarbeitet
Sorry, hab die Installationsanweisung auch erst gestern im Wikiartikel eingetragen :(
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 15 Februar 2017, 19:51:34
Moin,
Ich habe jetzt das Beispiel von setstate übernommen weil ich es optisch ansprechend finde.

Habe jedoch ein Problem mit der MediaList.
Die angezeigten Cover sind riesig und die Liste geht weit über den Bildschirm (nach unten) hinaus (Bild anbei)

Wie kann ich das ändern?

Mit freundlichen Grüßen
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: n4rrOx am 16 Februar 2017, 09:06:23
Hi,

ich glaube ohne Code der index.html und der Unterseite mit der MediaList wird dir so schnell keiner helfen können  ;)
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 16 Februar 2017, 17:37:36
 8),
Ja, natürlich. Das kommt davon wenn man mal schnell was zwischen Tür und Angel fragen möchte.

Hier der HTML Teil der MediaList
        <li data-row="1" data-col="2" data-sizex="7" data-sizey="6">
             <header>PLAYLIST</header>
     <div data-type="label" data-device="myMediaList" data-get="CurrentDir" class="" ></div>         
             
             <div data-type="select" data-device="myMediaList" data-list="FolderContent" data-get="CurrentDir" data-set="RequestedDirectory" class="wider" ></div>

              <div data-type="medialist" data-device="myMediaList" data-get="currentdir_playlist" data-pos="Pos" data-set="play" class="vbox phone-width"></div>
        </li>


Und hier meine Index HTML
<!DOCTYPE html>
<html>
<head>

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <meta name="widget_base_width" content="76">
    <meta name="widget_base_height" content="83">
    <meta name="gridster_cols" content="13">
    <meta name="gridster_rows" content="9">
   
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="gridster_disable" content="0">
    <meta name="widget_margin" content="1">
    <meta name="longpoll" content="1">
    <meta name="debug" content="2">

    <link rel="stylesheet" href="lib/jquery.gridster.min.css" />
    <link rel="stylesheet" href="lib/openautomation.css" />
    <link rel="stylesheet" href="lib/fhemSVG.css" />
    <link rel="stylesheet" href="css/fhem-tablet-ui.css" />
    <link rel="stylesheet" href="lib/font-awesome.min.css" />
    <link rel="stylesheet" href="lib/material-icons.min.css" />
    <link rel="stylesheet" href="lib/jquery.toast.min.css" />

    <!-- define your personal style here, it wont be overwritten  -->
    <!-- link rel="stylesheet" href="css/fhem-green-ui.css" / -->
    <!-- link rel="stylesheet" href="css/fhem-tablet-ui-user.css" / -->


    <script src="lib/jquery.toast.min.js"></script>
    <script src="lib/jquery.gridster.min.js"></script>
    <script src="js/fhem-tablet-ui.js" defer></script>

    <title>FHEM-Tablet-UI-eval</title>
</head>
<body>
    <div class="gridster">
        <ul>
        <li data-row="1" data-col="1" data-sizex="1" data-sizey="9">
<header><div data-type="label" class="medium orange">Menu</header>
            <div class="cell">
                <div data-type="pagebutton" data-url="#content_main.html"     data-load="#content1" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern="(.*/||.*index_page_left_demo.html||.*#content_main.html)" data-icon="fa-home" class="default top-space"></div>
                <div data-type="pagebutton" data-url="#content_music.html"    data-load="#content9" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_music.html" data-icon="fa-music" class="prefetch top-space"></div>
                <div data-type="pagebutton" data-url="#content_rollaeden.html" data-load="#content3" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_rollaeden.html" data-icon="oa-fts_shutter_50" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_light.html"      data-load="#content2" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_light.html" data-icon="fa-lightbulb-o" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_phone.html"    data-load="#content5" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_phone.html" data-icon="fa-phone" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_cam.html"   data-load="#content6" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_cam.html" data-icon="fa-video-camera" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_heating.html"     data-load="#content7" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_heating.html" data-icon="oa-sani_heating" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_charts.html"   data-load="#content8" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_traffic.html" data-icon="fa-line-chart" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_wetter.html"   data-load="#content4" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_wetter.html" data-icon="oa-weather_cloudy" class="top-space"></div>
                <div data-type="pagebutton" data-url="#content_dlna.html" data-load="#content11" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#musik-dg-settings.html" data-icon="oa-edit_settings" class="prefetch"></div>
       
                <div class="absolute bottom bottom-space-2x">
                   <div data-type="clock" data-format="H:i" class="large"></div>
                   <div data-type="clock" data-format="d.n.Y" class="small"></div>
                </div>
            </div>
        </li>
        <li data-row="1" data-col="2" data-sizex="12" data-sizey="9">
            <div class="page" id="content1"></div>
            <div class="page" id="content2"></div>
            <div class="page" id="content3"></div>
            <div class="page" id="content4"></div>
            <div class="page" id="content5"></div>
            <div class="page" id="content6"></div>
            <div class="page" id="content7"></div>
            <div class="page" id="content8"></div>
            <div class="page" id="content9"></div>
            <div class="page" id="content11"></div>
         </li>
        </ul>
            </div>
</body>
</html>


Mit freundlichen Grüßen
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: DerBaer am 16 Februar 2017, 20:18:43
Also sowit hab ich das jetzt nach langem hin und her auch ganz gut zum laufen gebracht.

Im Prinzip hab ich das originale Modul hergenommen, zusätzlich von setstate noch die beiden notifys OnMpdNewTrack und OnMpdPlay, sowie die Funktionen seiner 99_myUtils.pm.

Läuft soweit auch ganz gut, leider werden die Covers in dem Medialist Widget nur teilweise angezeigt, was wohl daran liegt dass ich das letzte notify nicht verwendet habe.
Dazu muss ich sagen, das Modul das setstate verwendet ist schon etwas veraltet und hat einige Funktionen nicht. Das jetzt auseinander zu klamüssern und 2 zu eins zu machen is für mich leider unmöglich. Bisher zumindest...  :P

Das wäre mal zumindest ein Punkt den ich zu beanstanden hab  ;D
Zum andern geht das hoch scrollen der Medialist nicht im fullyBrowser, schaltet man das reload beim Pull in den Einstellungen aus, dann geht's  auch.

Alles in allem trotzdem ne gute Arbeit und ich bedanke mich  :)


Edit:

Zu den Covers noch:

Wenn man mit Last.FM verbunden ist, wird vom MPD Modul eine URL zu einem Albumbild ausgegeben.
Könnte man dieses nicht iwi über die Medialist abfragen?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: n4rrOx am 17 Februar 2017, 11:01:16
Hi,

versuch mal folgende Zeile:
<header><div data-type="label" class="medium orange">Menu</header>

in Folgendes zu ändern:
<header><div data-type="label" class="medium orange">Menu</div></header>
ggf. kann schon das der Grund sein, warum das Design "zerschossen" wird.... muss aber nicht sein... ansonsten müsste setstate nachschauen, was da evtl. im Widget schief läuft.

Gruß
Mathias
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 17 Februar 2017, 12:40:02
Zitat von: DerBaer am 16 Februar 2017, 20:18:43
Wenn man mit Last.FM verbunden ist, wird vom MPD Modul eine URL zu einem Albumbild ausgegeben.
Könnte man dieses nicht iwi über die Medialist abfragen?
Natürlich, viele der letzten Änderungen am MPD Modul wurde ja vorgenommen um direkt mit TabletUI zusammen arbeiten zu können.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 17 Februar 2017, 14:50:27
ZitatHi,

versuch mal folgende Zeile:
Code: [Auswählen]
<header><div data-type="label" class="medium orange">Menu</header>

in Folgendes zu ändern:
Code: [Auswählen]
<header><div data-type="label" class="medium orange">Menu</div></header>
ggf. kann schon das der Grund sein, warum das Design "zerschossen" wird.... muss aber nicht sein... ansonsten müsste setstate nachschauen, was da evtl. im Widget schief läuft.

Gruß
Mathias

Danke für den Hinweis.
Leider keine Änderung auf der Seite, auch nicht bei den anderen Seiten meines Tablet-UI.
Da hilft dann nur warten auf setstate
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: DerBaer am 17 Februar 2017, 15:35:12
Zitat von: Wzut am 17 Februar 2017, 12:40:02
Natürlich, viele der letzten Änderungen am MPD Modul wurde ja vorgenommen um direkt mit TabletUI zusammen arbeiten zu können.

Das hab ich auch verfolgt. Es fehlt momentan halt noch an der Medialist. Aber wird zur gegebenen Zeit schon noch kommen.
War ja jetzt "nur" meine Rückmeldung zu dem ganzen Thema.  ;D
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 19 Februar 2017, 08:11:04
Zitat von: Shadow3561 am 15 Februar 2017, 19:51:34
Moin,
Ich habe jetzt das Beispiel von setstate übernommen weil ich es optisch ansprechend finde.

Habe jedoch ein Problem mit der MediaList.
Die angezeigten Cover sind riesig und die Liste geht weit über den Bildschirm (nach unten) hinaus (Bild anbei)

Wie kann ich das ändern?

Mit freundlichen Grüßen


Moin,
Habe den Fehler jetzt gefunden.
Habe TabletUi 2.5 installiert, da ist wohl das MediaList Modul noch nicht portiert worden.
Bin jetzt wieder zurück auf 2.2 und alles läuft wie es soll.

Danke an alle fürs Kopfzerbrechen.

MfG

Edit: habe noch ein weni optimiert und bin soweit zufrieden.
Bin aber für jede Anregung dankbar, also legt los wenn ihr noch Ideen habt.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Gunther am 26 Oktober 2017, 02:34:49
Kannst Du mal sagen, was Du audiomäßig angebunden hast? Wie hast Du das in FHEM und Tablet UI definiert?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 26 Oktober 2017, 16:36:21
Zitat von: Gunther am 26 Oktober 2017, 02:34:49
Kannst Du mal sagen, was Du audiomäßig angebunden hast? Wie hast Du das in FHEM und Tablet UI definiert?
Sorry, aber ich stehe bezüglich deiner Frage ein wenig auf dem Schlauch.
Was genau möchtest du wissen?

MfG
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: DerBaer am 26 Oktober 2017, 17:17:54
Ich glaub er meint wie das mit dem Lautsprecher verkabelt is ^^
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 26 Oktober 2017, 17:58:50
Aha,
Also mein BananaPi hängt per HDMI an meinem Onkyo Tx-Nr5008.
Es besteht aber auch die Möglichkeit einen Stream mit MPD zu senden und diesen als Radiostation über einen Netzwerkplayer einzubinden.

MfG
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Gunther am 27 Oktober 2017, 00:07:58
Zitat von: Shadow3561 am 26 Oktober 2017, 16:36:21
Sorry, aber ich stehe bezüglich deiner Frage ein wenig auf dem Schlauch.
Was genau möchtest du wissen?

MfG

Mich interessiert, was Du hinter Server und Radio stecken hast. Sind das Funktionen des MPD Players oder wie hast Du Radio und Server (Streaming?) eingebunden?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 27 Oktober 2017, 07:56:31
moin,
im Bereich Server ist die Playlist auswahl vom Modul MediaList (https://wiki.fhem.de/wiki/MediaList).

Die Radioauswahl ist vom Modul MPD und ist quasi die Playlistauswahl vom MPD-Player.

<div data-type="select" data-device="MPD1" data-list="playlistcollection" data-get="playlistname" data-set="playlist" class="col-1-2" ></div>
Ich hoffe es reicht dir als Antwort.

MfG
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Gunther am 27 Oktober 2017, 11:32:30
Danke! Das sieht spannend aus!
Ich muss mich mal tiefer in MDP einlesen. Mopify zum Abspielen von Spotify klingt interessant.
Mal schauen, ob es da eine Möglichkeit gibt die Spotifyapp zum Suchen und Bestücken von Playlisten nicht mehr öffnen zu müssen.

Stellst Du die Definition (Code) Deines Onkyoreceivers (FHEM/ Tablet UI) zur Verfügung?
Was hat es mit dem Listening Mode auf sich?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Shadow3561 am 27 Oktober 2017, 11:59:40
Zitat von: Gunther am 27 Oktober 2017, 11:32:30
Stellst Du die Definition (Code) Deines Onkyoreceivers (FHEM/ Tablet UI) zur Verfügung?
Was hat es mit dem Listening Mode auf sich?

   <header><div data-type="label" class="medium orange">Onkyo AVR</div></header>
       
              <div data-type="label" class="darker" data-device="AVR"
                               data-get="presence">
                               </div>
        <div class="cell">
                         
                               
            <div data-type="switch" data-device="AVR"
            data-get="stateAV"
                data-icon="fa-power-off"
                data-on-color="green"
                data-on-background-color="#555"
                data-off-color="red"
                data-background-icon="fa-square-o"
                class="wider"></div>
        <div data-type="label" class="darker top-space-2x">Eingang</div>
           <div data-type="select" data-device="AVR" data-items='["usb","music-server","internet-radio","cbl-sat","bd/dvd","video4"]' data-get="input" data-set="input" data-alias='["USB-Front","Music-Server","Internet-Radio","Sky-Receiver","Media-Player","HDMI-Front"]' class="" ></div>
                                        </div>
                                    <div class="cell">
                                   <div data-type="label" class="darker top-space-2x">Listening-Mode</div>       
                                 <div data-type="select" data-device="AVR" data-get="listening-mode" data-set="listening-mode"
              data-items='["stereo","all-ch-stereo","pure-audio","direct","audyssey-dsx"]'
                data-alias='["Stereo","all-Ch-Stereo","Pure-Audio","Direct","Audyssey-DSX"]'
              class="" ></div>
        </div>
          <div class="cell">
          <div data-type="label" class="darker top-space-2x">Volume</div>
        <div data-type="knob" data-device='AVR' data-get="volume" data-step="1" data-inputcolor="green" data-fgcolor="green" data-set="volume" class="">
                    </div>
                   
                  <div class="cell"> 
                   <div data-type="label" class="darker top-space-2x">Subwoofer</div>
                    <div data-type="switch" data-device="Subwoofer"
                    data-icon="oa-audio_loudness" data-backround-color="#505050" data-on-color="green"
                    class="invert"></div>
                   
                    <div data-type="label" class="darker top-space-2x">Woofer-Level</div>
                    <div data-type="circlemenu" data-direction="vertical-top" class="noshade">
                   
              <ul>
                <li><div data-type="push" data-icon="fa-wrench"></div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="-12" data-set-on="-12" data-icon="">-12</div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="-6" data-set-on="-6" data-icon="">-6</div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="0" data-set-on="0" data-icon="">0</div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="2",data-set-on="2" data-icon="">2</div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="9" data-set-on="9" data-icon="">9</div></li>
                <li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="12" data-set-on="12" data-icon="">12</div></li>
                    </ul>   
                     
                   </div>
                   </div>


Listening-Mode ist der Wiedergabe-Modus des Verstärkers. Ich denke der o.A. Code erklärt es von selbst.

MfG
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Gunther am 29 Oktober 2017, 01:56:00
Danke Dir!  :)
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wasserwerk33 am 03 Januar 2018, 14:50:00
Hi ich hätte da mal noch eine fragen.

Ich bin zwar noch nicht im FTUI mit meinem Radio angelangt, aber ihr könnt mir doch bestimmt helfen.
Ich habe das Programm Medialist soweit nach Wiki installiert.
defmod meineMusik MediaList /media/music/
attr meineMusik MediaList_CacheFileDir /var/lib/mpd/playlists/
attr meineMusik MediaList_PathReplaceFrom /media/pi/68FA-40DE 68FA-40DE/PUR
attr meineMusik MediaList_PlayerDevice StreamRadio
attr meineMusik MediaList_mkTempCopy symlink
attr meineMusik room Radio

setstate meineMusik 2018-01-02 19:24:12 playlist []
setstate meineMusik 2018-01-02 19:24:12 playlistduration
setstate meineMusik 2018-01-02 19:24:12 playlistname PUR

Habe ich noch irgendwas vergessen oder falsch installiert??
Den leider klappt dieses nicht bei mir.

danke schon mal
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 03 Januar 2018, 19:44:25
1. Die generierte Playlist "meineMusik.m3u" enthält die mp3-dateien ohne Pfadangabe?
2. die MP3 Dateien befinden sich alle im angegebenen cachefiledir?
3. MPD ist wie im Wiki konfigirierte das er allen Symlinks folgt?
4. MPD hat Zugriffsrechte auf die verlinkten "echten" Files?
5. Fehlermeldung des MPD wenn du die Playlist manuell in den MPD lädst?
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: ulli am 07 September 2018, 21:03:22
Hallo zusammen,

ich habe gerade das Module bei mir integriert mit Mopidy....funktioniert soweit.
Leider werden aber die Mustiktitel nicht aktualisiert....erst wenn ich immer wieder ein "get device statusRequest" händisch ausführe.

Was ist dabei das Problem? Ich habe es auch mit einem waits 10 versucht...ohne Erfolg

Update:
Die einzigen Werte die nach einem "set device play 0" aktualisiert werden sind Title, rawTitle, volume.
In Title und rawTitle steht dann der name des Playlisteintrages.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Tobias am 12 September 2018, 09:47:48
das ist leider ein Problem, ich halte bei mir eine alte Verson des Moduls wo es noch sauber funktioniert.
73_MPD.pm                             13247 2017-01-26 20:20:08Z Wzut
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 12 September 2018, 10:07:30
Könnt ihr bitte mal die angehängte Version testen ?
Falls das Problem damit erledigt ist checke ich sie ein.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: xasher am 15 Oktober 2019, 17:42:34
Hallo zusammen,

ich finde das Projekt sehr interessant. Ich komme mit einigen Punkten allerdings noch nicht klar.
Ich habe mopidy mit spotify installiert. Auf der grafischen Übersicht Iris bekomme ich soweit auch alles angezeigt.

In Fhem sehe ich allerdings meine Playlists nicht - siehe Screenshot. Habe ich was bei der Installation übersehen? Oder geht die Funktion gerade nicht mehr?

Für einen Tipp wäre ich euch dankbar.

Grüße,
Alex
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 15 Oktober 2019, 22:00:55
Bilder /Screenshots sind immer schlecht, was helfen könnte wäre ein list ( in Code Tags ! ) vom Device
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: xasher am 16 Oktober 2019, 07:13:06
Hallo Wzut,

vielen Dank für die Antwort. Hier mal ein list auf das Device:


Internals:
   CFGFN      ./FHEM/01_spotify.cfg
   CHANGED   
   FUUID      5da5b4c4-f33f-2077-7caa-fe890cb54dee4b57
   HOST       localhost
   INTERVAL   30
   MUTE       off
   NAME       MPD1
   NR         596
   PORT       6600
   PRESENT    1
   STATE      play
   TYPE       MPD
   VERSION    MPD 0.19.0
   VOLUME     100
   READINGS:
     2019-10-15 20:38:42   Album           +
     2019-10-15 17:35:09   AlbumArtist     Ed Sheeran
     2019-10-15 17:35:09   Artist          Ed Sheeran
     2019-10-15 13:57:57   Cover           
     2019-10-15 20:38:42   Date            2011
     2019-10-15 11:47:31   Disc            1
     2019-10-15 13:57:57   Genre           
     2019-10-15 20:38:42   Id              77
     2019-10-15 13:57:57   Last-Modified   
     2019-10-15 13:57:57   Name           
     2019-10-15 20:38:42   Pos             4
     2019-10-15 20:38:42   Time            258
     2019-10-15 20:38:42   Title           The A Team
     2019-10-15 20:38:42   Track           1
     2019-10-15 20:38:42   X-AlbumUri      spotify:album:0W5GGnapMz0VwemQvJDqa7
     2019-10-15 11:47:31   albums          0
     2019-10-15 12:04:04   artist         
     2019-10-15 11:47:31   artists         0
     2019-10-15 11:47:31   bitrate         160
     2019-10-15 11:47:31   consume         0
     2019-10-15 20:38:45   cover           https://i.scdn.co/image/ab67616d00001e02f0e911d0e5aadefc431bf34a
     2019-10-15 11:47:31   currentTrackProvider Bibliothek
     2019-10-15 11:47:31   db_playtime     0
     2019-10-15 11:47:31   db_update       0
     2019-10-16 07:10:20   elapsed         101.713
     2019-10-15 14:00:25   error1          connect: Connection refused
     2019-10-15 17:35:07   error2          socketclose: Bad file descriptor
     2019-10-15 20:38:42   file            spotify:track:1VdZ0vKfR5jneCmWIUAMxK
     2019-10-15 13:59:03   last_error      IdleStart: Connection refused
     2019-10-15 11:29:49   mpd_event       player
     2019-10-15 09:44:24   mute            off
     2019-10-15 12:04:04   name            0
     2019-10-15 20:38:42   nextsong        5
     2019-10-15 20:38:42   nextsongid      78
     2019-10-15 11:45:57   outputenabled0  0
     2019-10-15 11:45:57   outputname0     Mute
     2019-10-15 17:36:20   playlist        22
     2019-10-15 11:29:49   playlist_crc    62105
     2019-10-15 13:57:57   playlist_json   
     2019-10-15 13:57:57   playlist_num    -1
     2019-10-15 17:36:20   playlistcollection
     2019-10-15 17:36:55   playlistinfo    [{"Artist":"Ed Sheeran","Title":"Happier","Album":"÷ (Deluxe)","Time":"208","File":"spotify:track:2RttW7RAu5nOAfq6YFvApB","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Thinking out Loud","Album":"x (Deluxe Edition)","Time":"282","File":"spotify:track:34gCuhDGsG4bRPIf9bb02f","Track":"11","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Galway Girl","Album":"÷ (Deluxe)","Time":"171","File":"spotify:track:0afhq8XCExXpqazXczTSve","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Dive","Album":"÷ (Deluxe)","Time":"238","File":"spotify:track:51ChrwmUPDJvedPQnIU8Ls","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"The A Team","Album":"+","Time":"258","File":"spotify:track:1VdZ0vKfR5jneCmWIUAMxK","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02f0e911d0e5aadefc431bf34a"},{"Artist":"Ed Sheeran","Title":"Shape of You","Album":"÷ (Deluxe)","Time":"234","File":"spotify:track:7qiZfU4dY1lWllzX7mPBI3","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Castle on the Hill","Album":"÷ (Deluxe)","Time":"261","File":"spotify:track:6PCUP3dWmTjcTtXY02oFdT","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Perfect","Album":"÷ (Deluxe)","Time":"263","File":"spotify:track:0tgVpDi06FyKpA1z0VMD4v","Track":"5","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"What Do I Know?","Album":"÷ (Deluxe)","Time":"237","File":"spotify:track:2pJZ1v8HezrAoZ0Fhzby92","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Don't","Album":"x (Deluxe Edition)","Time":"220","File":"spotify:track:1huvTbEYtgltjQRXzrNKGi","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"I See Fire - From \"The Hobbit - The Desolation Of Smaug\"","Album":"The Hobbit - The Desolation Of Smaug (Original Motion Picture Soundtrack / Special Edition)","Time":"301","File":"spotify:track:3B7udSGy2PfgoCniMSb523","Track":"28","Cover":"https://i.scdn.co/image/6fcd5648de0faf3a40c9ddbed9e9e9d7e0d278f4"},{"Artist":"Ed Sheeran","Title":"Bloodstream","Album":"x (Deluxe Edition)","Time":"300","File":"spotify:track:5v4sZRuvWDcisoOk1PFv6T","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Nancy Mulligan","Album":"÷ (Deluxe)","Time":"180","File":"spotify:track:35QZaWQRkmnAVqBF1TLCxQ","Track":"15","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"New Man","Album":"÷ (Deluxe)","Time":"189","File":"spotify:track:5HDPtsnyb3maFmPL8LLUTG","Track":"8","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"I'm a Mess","Album":"x (Deluxe Edition)","Time":"245","File":"spotify:track:0xCA70t1ZA4fa9UOE0lIJm","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Sing","Album":"x (Deluxe Edition)","Time":"235","File":"spotify:track:6K8qKeWo5MsFED7wCR6Kop","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"You Need Me, I Don't Need You","Album":"+","Time":"220","File":"spotify:track:5KL4iZkCTZyXl7KnHgfVDj","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e02ed139c2e0e3681cc2d35e256"},{"Artist":"Ed Sheeran","Title":"Eraser","Album":"÷ (Deluxe)","Time":"227","File":"spotify:track:7oolFzHipTMg2nL7shhdz2","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Supermarket Flowers","Album":"÷ (Deluxe)","Time":"221","File":"spotify:track:4VuS959DSpr82t3qBqCrWG","Track":"12","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Photograph","Album":"x (Deluxe Edition)","Time":"259","File":"spotify:track:1HNkqx9Ahdgi1Ixy2xkKkL","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Shape of You","Album":"÷ (Deluxe)","Time":"234","File":"spotify:track:7qiZfU4dY1lWllzX7mPBI3","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Imagine Dragons","Title":"Thunder","Album":"Evolve","Time":"187","File":"spotify:track:1zB4vmk8tFRmM9UULNzbLB","Track":"10","Cover":"https://i.scdn.co/image/b7dd9a6acef8183c090e705e4572f5bdbef3e31c"},{"Artist":"Backstreet Boys","Title":"Everybody (Backstreet's Back) - Extended Version","Album":"The Hits--Chapter One","Time":"286","File":"spotify:track:3tH03v5SIWaglfE3rzXzeB","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02c2f0d820b1113f9a243fb973"},{"Artist":"*NSYNC","Title":"Bye Bye Bye","Album":"No Strings Attached","Time":"201","File":"spotify:track:4r8lRYnoOGdEi6YyI5OC1o","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02fceb9d92981970dbeea23257"},{"Artist":"Louane","Title":"On était beau","Album":"Louane","Time":"206","File":"spotify:track:10ZrEcxWcD9vOSUVhUH33O","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02c0b3a7a9a2bd9ca47471e3c9"},{"Artist":"Sia","Title":"Bird Set Free","Album":"This Is Acting","Time":"252","File":"spotify:track:1LsH71NteRF29VdSkXoF4Y","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02fc36b265066a58e205ecbd5c"},{"Artist":"Welshly Arms","Title":"Legendary","Album":"No Place Is Home","Time":"232","File":"spotify:track:2bDENJyfbxj0neGiXUFvIX","Track":"9","Cover":"https://i.scdn.co/image/ab67616d00001e02605fea88497f83c4881df0da"},{"Artist":"Taylor Swift","Title":"I Knew You Were Trouble.","Album":"Red (Big Machine Radio Release Special)","Time":"220","File":"spotify:track:6FB3v4YcR57y4tXFcdxI1E","Track":"8","Cover":"https://i.scdn.co/image/8e76cca4edfc4780b4bc86062e8808534d067e52"},{"Artist":"Alessia Cara","Title":"Scars To Your Beautiful","Album":"Know-It-All (Deluxe)","Time":"230","File":"spotify:track:42ydLwx4i5V49RXHOozJZq","Track":"10","Cover":"https://i.scdn.co/image/6dea260c2c37abfd9a034e758a047481f68b4c85"},{"Artist":"KALEO","Title":"Way Down We Go","Album":"A/B","Time":"214","File":"spotify:track:0y1QJc3SJVPKJ1OvFmFqe6","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02f793a842c1642b09a768a63b"},{"Artist":"Imagine Dragons","Title":"Whatever It Takes","Album":"Evolve","Time":"201","File":"spotify:track:6Qn5zhYkTa37e91HC1D7lb","Track":"3","Cover":"https://i.scdn.co/image/b7dd9a6acef8183c090e705e4572f5bdbef3e31c"},{"Artist":"Jess GlynneClean Bandit","Title":"Rather Be (feat. Jess Glynne)","Album":"Rather Be (feat. Jess Glynne)","Time":"228","File":"spotify:track:3s4U7OHV7gnj42VV72eSZ6","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e027e519297d9876b6afff2ab7b"},{"Artist":"Peter Fox","Title":"Schwarz zu blau","Album":"Stadtaffe","Time":"216","File":"spotify:track:1Fjz0ME9pzk553wH86m3ZZ","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e029061a4e47413aff8f58a3c9c"},{"Artist":"Seeed","Title":"Augenbling","Album":"SEEED","Time":"217","File":"spotify:track:4eT8TcG3KKlprFcYePA9gw","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e024ee35a7450f3c8476654a256"},{"Artist":"Die Orsons","Title":"Schwung in die Kiste","Album":"What's Goes?","Time":"243","File":"spotify:track:1d0LKskvREPlQfBanvabh8","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02b995f9f8ee282d935198a072"},{"Artist":"Die Orsons","Title":"Rosa, Blau, Grün","Album":"Das Chaos und Die Ordnung","Time":"246","File":"spotify:track:4qC0H1RHG3EnHw3qIyyxYb","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e025865d1de03a7feab31191ca1"},{"Artist":"Gianna Nannini","Title":"Bello e impossibile","Album":"Profumo","Time":"283","File":"spotify:track:3dZHWv3IsAQLzAr7FLJoJA","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e025ee0276a8cb48fff5608bea0"},{"Artist":"Udo Jürgens","Title":"Ich war noch niemals in New York","Album":"Aber bitte mit Sahne - Jubiläumsedition","Time":"283","File":"spotify:track:18q9XvWQgY1iO3PLGMit8l","Track":"13","Cover":"https://i.scdn.co/image/ab67616d00001e0226f3c1f6966e591fe3d64e5b"},{"Artist":"Dieter Thomas Kuhn & Band","Title":"Willst Du Mit Mir Geh'n","Album":"Wer Liebe Sucht","Time":"192","File":"spotify:track:06UxOBMpXvXj5glumCFXSF","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e028a004e257197b627eeaa3ab0"},{"Artist":"P!nk","Title":"Beautiful Trauma","Album":"Beautiful Trauma","Time":"250","File":"spotify:track:2DlIwu1iDTILEMXA7MUotn","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0200164c96548a622d34b39828"},{"Artist":"Ricchi E Poveri","Title":"Mamma Maria","Album":"The Collection","Time":"176","File":"spotify:track:7tVEeTbzEJkHP0EqUu6rmf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02e46c669e434e80209396680b"},{"Artist":"OneRepublic","Title":"Kids","Album":"Oh My My (Deluxe)","Time":"238","File":"spotify:track:4IG7IRfkbeLBGaQLGWwNPS","Track":"4","Cover":"https://i.scdn.co/image/612fd0cb8724ba18187c4f90c0c556e057db18ad"},{"Artist":"MKTO","Title":"Classic","Album":"Classic","Time":"175","File":"spotify:track:5x9VIW2fS21JMswOt6AORI","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e023468ab7160ba573bf7ff59ed"},{"Artist":"CluesoDie Fantastischen Vier","Title":"Zusammen feat. Clueso","Album":"Captain Fantastic","Time":"225","File":"spotify:track:35Ma4j9sPWhUAJ471naHV3","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e026712dc332b14708db08cddce"},{"Artist":"Netta","Title":"Toy","Album":"Toy","Time":"180","File":"spotify:track:6n2eIfLj0wOOUkUfNmYzlh","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c78e0ef9967093485f00ea13"},{"Artist":"Mikolas Josef","Title":"Lie to Me","Album":"Lie to Me","Time":"171","File":"spotify:track:6zBdVVksaTQeAzwfszbovz","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0241d33a9ea79736306e902589"},{"Artist":"Rita OraLiam Payne","Title":"For You (Fifty Shades Freed) (& Rita Ora)","Album":"FIFTY SHADES OF GREY - Befreite Lust (Original Motion Picture Soundtrack)","Time":"245","File":"spotify:track:6GKkczxg0QqLUqrhsic1Ut","Track":"2","Cover":"https://i.scdn.co/image/2db339f0f62e0bb118ff4c9a67320cecfdb35031"},{"Artist":"K.A.S.T.A","Title":"Vokrug Shum","Album":"Vokrug Shum","Time":"214","File":"spotify:track:0dSeAQtXHjXROIIyjAGKTf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0291a08c84ac80ae8ab41a03cb"},{"Artist":"P!nk","Title":"Just Like Fire (From the Original Motion Picture \"Alice Through The Looking Glass\")","Album":"Just Like Fire (From the Original Motion Picture \"Alice Through The Looking Glass\")","Time":"215","File":"spotify:track:7K5dzhGda2vRTaAWYI3hrb","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e022002a63b1572e5cd031ab78f"},{"Artist":"Sara Bareilles","Title":"Love Song","Album":"Little Voice","Time":"259","File":"spotify:track:4E6cwWJWZw2zWf7VFbH7wf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021c3e0a58f3ee28af2922e351"},{"Artist":"Ingrid Michaelson","Title":"Afterlife","Album":"Lights Out","Time":"245","File":"spotify:track:13iycH8hoDh5116sUTZXsD","Track":"12","Cover":"https://i.scdn.co/image/ab67616d00001e027939d39424c0cfcc321415ab"},{"Artist":"Alvaro Soler","Title":"La Cintura","Album":"Mar De Colores (Versión Extendida)","Time":"205","File":"spotify:track:6VUJQqyeQhAZHkQbSDqLtI","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e025767e044062c6d03256397e5"},{"Artist":"Bruno Mars","Title":"Young Girls","Album":"Unorthodox Jukebox","Time":"229","File":"spotify:track:3G5iN5QBqMeXx3uZPy8tgB","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02926f43e7cce571e62720fd46"},{"Artist":"Jess Glynne","Title":"I'll Be There","Album":"I'll Be There","Time":"194","File":"spotify:track:083Qf6hn6sFL6xiOHlZUyn","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0277179b6ddeb4b4f4757e7a10"},{"Artist":"DisclosureFlumeEliza Doolittle","Title":"You & Me - Flume Remix","Album":"Settle (Special Edition)","Time":"283","File":"spotify:track:3W2ZcrRsInZbjWylOi6KhZ","Track":"34","Cover":"https://i.scdn.co/image/ab67616d00001e0209f5242f9d639ee5669afa45"},{"Artist":"Wincent Weiss","Title":"Feuerwerk","Album":"Irgendwas gegen die Stille","Time":"209","File":"spotify:track:3GRoxbBauU8Ui1zUJwn9aD","Track":"2","Cover":"https://i.scdn.co/image/b344392c64d9e23baf75d705e21e2b09321b750b"},{"Artist":"Wincent Weiss","Title":"Musik sein","Album":"Irgendwas gegen die Stille","Time":"194","File":"spotify:track:00ZoztotP7jEoezTPNMjvm","Track":"1","Cover":"https://i.scdn.co/image/b344392c64d9e23baf75d705e21e2b09321b750b"},{"Artist":"Beyoncé","Title":"Halo","Album":"I AM...SASHA FIERCE","Time":"262","File":"spotify:track:2MfOcbtgz2yTsiznFmVZUN","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e022fd16e69054586f25be54f49"},{"Artist":"Texas","Title":"Inner Smile","Album":"The Greatest Hits","Time":"231","File":"spotify:track:6X6ljHP0LlsdUILsGwfQ40","Track":"5","Cover":"https://i.scdn.co/image/1f0366a3b54d274ad7af98c2f0546395d7fc309c"},{"Artist":"Panic! At The Disco","Title":"High Hopes","Album":"Pray for the Wicked","Time":"191","File":"spotify:track:1rqqCSm0Qe4I9rUvWncaom","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02c5148520a59be191eea16989"},{"Artist":"Christina Perri","Title":"sea of lovers","Album":"head or heart","Time":"215","File":"spotify:track:4EisHKHtmZ2Sa5z2e1kYEp","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02891b5348358ee43343077db2"},{"Artist":"Marco Frisina","Title":"Pacem In Terris","Album":"The Best Of Marco Frisina","Time":"264","File":"spotify:track:64gXE26DHs96jsPz7zciMI","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e020c580758f7fdfc8c3b865d03"},{"Artist":"Sasha","Title":"If You Believe","Album":"Greatest Hits","Time":"240","File":"spotify:track:4AstOWewI6yGeMh6ysWFCW","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028c2724dcf12ce01b4c7d916c"},{"Artist":"Loud LuxuryBrando","Title":"Body","Album":"Body","Time":"163","File":"spotify:track:3jvpPbTJqfyKvEOtOsn83m","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c85a86599e5e237504221b1f"},{"Artist":"B.o.B","Title":"So Good","Album":"Strange Clouds","Time":"213","File":"spotify:track:28GUjBGqZVcAV4PHSYzkj2","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02a191830c8b300bc71c2faac7"},{"Artist":"Ava Max","Title":"Sweet but Psycho","Album":"Sweet but Psycho","Time":"187","File":"spotify:track:25sgk305KZfyuqVBQIahim","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c5015d2a9270865a5979f56b"},{"Artist":"Sia","Title":"I'm Still Here","Album":"I'm Still Here","Time":"242","File":"spotify:track:5KGTKwOePys7aH4o6EzXEP","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0288aec414e2ddc035d7f66104"},{"Artist":"Drupi","Title":"Piccola e fragile","Album":"Drupi","Time":"268","File":"spotify:track:5MsOJoGpCAqdTf90mHzISd","Track":"9","Cover":"https://i.scdn.co/image/ab67616d00001e028ca951f14ecf9e78030d191e"},{"Artist":"Udo Jürgens","Title":"Immer wieder geht die Sonne auf","Album":"Was ich Dir sagen will","Time":"185","File":"spotify:track:4NE71zloHC3tV0YZAo1HXr","Track":"5","Cover":"https://i.scdn.co/image/ab67616d00001e024672ce8568d045a0ad409226"},{"Artist":"MEUTE","Title":"You & Me","Album":"You & Me","Time":"306","File":"spotify:track:1MdbDBwEEecnlLiyWChJFh","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021e4b57f1cfb61e9bfef1e8ca"},{"Artist":"Robin SchulzErika Sirola","Title":"Speechless (feat. Erika Sirola)","Album":"Speechless (feat. Erika Sirola)","Time":"215","File":"spotify:track:1rCcsYnmqbMYdkG7kS9GC5","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02318e24185fcbd27faeeef55c"},{"Artist":"Rita Ora","Title":"Let You Love Me","Album":"Phoenix (Deluxe)","Time":"191","File":"spotify:track:5Fla3zyOCcIRqrDoKLU0DP","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02f1b136eb0388414a8225a348"},{"Artist":"Ellie GouldingSwae LeeDiplo","Title":"Close To Me (with Diplo) (feat. Swae Lee)","Album":"Close To Me (feat. Swae Lee)","Time":"183","File":"spotify:track:5JEx7HbmvHQQswJCsoo9rA","Track":"1","Cover":"https://i.scdn.co/image/d2fc265553b67cc1e79958a531a0b5f8ae23fbd9"},{"Artist":"Marteria","Title":"Endboss","Album":"Zum Glück in die Zukunft","Time":"224","File":"spotify:track:2JGloz8S7kkUi57c892mnv","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021873e2932eadced388135837"},{"Artist":"Marteria","Title":"Scotty beam mich hoch","Album":"Roswell","Time":"249","File":"spotify:track:6zuUWT2b1cFs9NMVHuDLdY","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0263a0d158ea0c02b24749da06"},{"Artist":"Ava Max","Title":"So Am I","Album":"So Am I","Time":"183","File":"spotify:track:0uUNN1nSoUx1A4fkDCWDQ7","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02b8dcf98474721fe404ad780d"},{"Artist":"Matt Simons","Title":"Open Up","Album":"Open Up","Time":"168","File":"spotify:track:3ENfrioOpwovY3HrIAX3UC","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c4898b5e598158b3725e1bfd"},{"Artist":"Wincent Weiss","Title":"Hier mit dir","Album":"Hier mit dir","Time":"185","File":"spotify:track:3fqmx4fMxm2GPCrYe1TPOB","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0263e2ae77b985df1179f41439"},{"Artist":"Fettes Brot","Title":"Für immer immer","Album":"3 is ne Party","Time":"202","File":"spotify:track:5ofIisXnT7e7klW4K9w7Lh","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028cc0c3fe4f025b1e7df758d4"},{"Artist":"Michel Sardou","Title":"La maladie d'amour","Album":"La Maladie D'Amour","Time":"210","File":"spotify:track:2flivK5ivlprHRE7YNcRrj","Track":"11","Cover":"https://i.scdn.co/image/dd36e11f71e0a35e49b47d79164fa4cdadfdffec"},{"Artist":"Laith Al-Deen","Title":"Bilder von Dir","Album":"2000 - 2008: Best Of","Time":"296","File":"spotify:track:5JEenaFSoOuZgtat8bhwg1","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e021e2e9d850c26ad31aecb4f0f"},{"Artist":"Sido","Title":"Tausend Tattoos","Album":"Kronjuwelen","Time":"205","File":"spotify:track:2PAYSgrVOBz8RJqp9B7QLu","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0213160387f081dbf84f98a4d4"},{"Artist":"EAV","Title":"Samurai","Album":"100 Jahre EAV","Time":"237","File":"spotify:track:5hjO4HQ02cX2VJLcINshtr","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e027733f4a485ac9ff7bc0c7f6f"},{"Artist":"Lena","Title":"thank you","Album":"thank you","Time":"195","File":"spotify:track:3uCZ4IqMY54A0jxRkyPGPl","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02d09daaf2a06c91dbc4ffdd04"},{"Artist":"Pietro Lombardi","Title":"Bella Donna","Album":"Bella Donna","Time":"196","File":"spotify:track:3v9OYjvyB1tJ9sMrZIlfcz","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02aaa3177b2b3cc0b01a532028"},{"Artist":"Ellie Goulding","Title":"Anything Could Happen","Album":"Halcyon","Time":"286","File":"spotify:track:6bKetqXF3g4UgaXQlAYdgz","Track":"3","Cover":"https://i.scdn.co/image/c8a558841b91fd182549ca82f8faf6e2a93dd027"},{"Artist":"Clean BanditDemi Lovato","Title":"Solo (feat. Demi Lovato)","Album":"What Is Love? (Deluxe Edition)","Time":"223","File":"spotify:track:3NuK5xMlSlB6K2Qp16zf3h","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0237fb0680110fbb107740de5d"},{"Artist":"Troye SivanLauv","Title":"i'm so tired...","Album":"i'm so tired...","Time":"163","File":"spotify:track:7COXchtUOMd6uIT6HvmRaI","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02923d879fb957411a7504fa57"},{"Artist":"Dieter Thomas Kuhn","Title":"Sag Mir Quando, Sag Mir Wann","Album":"Wer Liebe Sucht","Time":"188","File":"spotify:track:3wx5BXdMwTECAQXoturLvF","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028a004e257197b627eeaa3ab0"},{"Artist":"Dieter Thomas Kuhn","Title":"Eine neue Liebe ist wie ein neues Leben","Album":"Mein Leben Für Die Musik","Time":"193","File":"spotify:track:3Wv3ISOIeSRtZSJHuHu5s1","Track":"8","Cover":"https://i.scdn.co/image/ab67616d00001e02c93eb8d0b620479a6239896c"},{"Artist":"Dieter Thomas Kuhn","Title":"Über den Wolken - Live","Album":"Im Auftrag der Liebe (Live)","Time":"253","File":"spotify:track:03cwW6MW7qEd7czbPj6tdG","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02c9e1741fde8949ebb7547e8c"},{"Artist":"Dieter Thomas Kuhn","Title":"Heute So, Morgen So","Album":"Gold (Party Edition)","Time":"139","File":"spotify:track:4CRYvxMZzb10dxTkCBzVSO","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ecb9cd779f2e4b1b835e5bfa"}]
     2019-10-15 17:36:20   playlistlength  92
     2019-10-15 17:36:20   playlistname   
     2019-10-15 11:47:31   playtime        0
     2019-10-15 13:59:03   presence        absent
     2019-10-15 11:47:31   random          0
     2019-10-15 11:47:31   rawTitle        Orchestral Suite No. 4 in D Major, BWV 1069: I. Overture
     2019-10-15 14:33:39   repeat          0
     2019-10-15 14:33:39   single          0
     2019-10-15 20:38:42   song            4
     2019-10-15 20:38:42   songid          77
     2019-10-15 11:47:31   songs           0
     2019-10-16 07:09:20   state           play
     2019-10-16 07:10:20   time            101:258
     2019-10-15 12:04:04   title           
     2019-10-15 11:47:31   updating_db     0
     2019-10-15 11:47:31   uptime          0
     2019-10-15 14:33:39   volume          100
     2019-10-15 11:47:31   xfade           0
Attributes:
   devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
   event-on-update-reading state,Title,Track,playlistinfo,Album,Artist,playlistcollection,file,cover,playlist,Pos,Time,elapsed
   icon       it_radio
   loadPlaylists 1
   room       Spotify
   useIdle    0
   webCmd     previous:stop:play:pause:next


Grüße,
Alex
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Wzut am 16 Oktober 2019, 19:28:04
ok, Attribut loadPlaylists ist auf 1
Gibt "mpc lsplaylists" denn die Listen auf der Konsole aus ?
Bzw in der FHEM Webansicht get <name> playlists ?

BTW: du verlierst einiges an Komfort mit useIdle = 0 , da dann der MPD nur im Intervall abgefragt wird und die Readings nicht Event basierend getzt werden.
Edit :
Ich sehe gerade :
Zitat von: xasher am 15 Oktober 2019, 17:42:34
Ich habe mopidy mit spotify installiert.
Setz das Attribut player auch bitte auf mopidy , dann gibt es richtige Fehlermeldungen. U.a. unterstützt der mopidy einige Befehle nicht die der echte mpd kann,
betrifft auch das Laden von Playlisten.
Titel: Antw:MPD Player Steuerung im FTUI
Beitrag von: Meisterull am 29 Dezember 2019, 20:59:59
Hi,
Ich habe diesen Code mal bei mir in die 99_myUtils.pm reinkopiert. Soweit würde das auch funktionieren.
Wo ich Hilfe bräuchte wäre, das ich nicht nur die Cover von Spotify bekomme sondern auch die von Tunein.
Ich peil des ganze mit Perl irgendwie nicht. :'(


Viele Grüße
Sebastian

99_myUtils.pm Funktionen

sub call_mpd1_getcover() {
    Log 1, "call_mpd1_getcover";
    BlockingCall("mpd_getcover","MPD1","done_mpd1_getcover",60);
}

sub done_mpd1_getcover($) {
    my $url = shift;
    Log 1, "done_mpd1_getcover";
    fhem ("setreading MPD1 cover ".$url);
}

sub call_mpd1_playlistinfo() {
    Log 1, "call_mpd1_playlistinfo";
    BlockingCall("mpd_playlistinfo","MPD1","done_mpd1_playlistinfo",120);
}

sub done_mpd1_playlistinfo($) {
    my $playlist = shift;
    Log 1, "done_mpd1_playlistinfo";
    fhem ("setreading MPD1 playlistinfo ".$playlist);
}

sub mpd_playlistinfo($) {
  my $device = shift;
  my ($all) = fhem("get $device mpdCMD playlistinfo");
  $all =~ s/"/\\"/g; 
  my @artist = ($all=~/\nArtist:\s(.*)\n/g);
  my @title = ($all=~/\nTitle:\s(.*)\n/g);
  my @album = ($all=~/\nAlbum:\s(.*)\n/g);
  my @time = ($all=~/\nTime:\s(.*)\n/g);
  my @file = ($all=~/\nfile:\s(.*)\n/g);
  my @track = ($all=~/\nTrack:\s(.*)\n/g);
  my @albumUri = ($all=~/\nX-AlbumUri:\s(.*)\n/g);

  my $ret = '[';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $lastUri = '';
  my $url;

  for my $i (0 .. $#artist)
  {
     if ( $lastUri ne $albumUri[$i]) {
       my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$albumUri[$i]);
       my $data = '';
       if ( $response->is_success ) {
         $data = $response->decoded_content;
         $url = decode_json( $data );
         $lastUri = $albumUri[$i];
       }
     }

      $ret=$ret.'{"Artist":"'.$artist[$i].'",';
      $ret=$ret.'"Title":"'.$title[$i].'",';
      $ret=$ret.'"Album":"'.$album[$i].'",';
      $ret=$ret.'"Time":"'.$time[$i].'",';
      $ret=$ret.'"File":"'.$file[$i].'",';
      $ret=$ret.'"Track":"'.$track[$i].'",';
      $ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';

      if ($i<$#artist) {$ret=$ret.',';}
  }
  $ret =~ s/;//g;
  $ret =~ s/\\n//g;
  return $ret.']';
}

sub mpd_getcover($) {
  my $device = shift;
  my $file = ReadingsVal($device, 'file', '');
  my $url = 'na';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$file);
  my $data = '';
  if ( $response->is_success ) {
     $data = $response->decoded_content;
     $url = decode_json( $data )->{'thumbnail_url'};
  }
  return $url;
}

sub
OnMpdPlayPressed()
{
my $val=ReadingsVal('AvReceiver', 'input', 'Webradio');
if(($val ne 'SAT') && ($val ne 'BD/DVD') && ($val ne 'Game')) {
  fhem "set AvReceiver input Airplay";
}
fhem "get MPD1 playlists";
}