text: # -*- coding: utf-8 -*-
  import time
  from utils import log, register, getclient
  from plexapi import CONFIG
  
  
  @register()
  def test_list_clients(account, plex):
      clients = [c.title for c in plex.clients()]
      log(2, 'Clients: %s' % ', '.join(clients or []))
      assert clients, 'Server is not listing any clients.'
  
  
  @register()
  def test_client_navigation(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      _navigate(plex, client)
      
  
  @register()
  def test_client_navigation_via_proxy(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      client.proxyThroughServer()
      _navigate(plex, client)
  
  
  def _navigate(plex, client):
      episode = plex.library.section(CONFIG.show_section).get(CONFIG.show_title).get(CONFIG.show_episode)
      artist = plex.library.section(CONFIG.audio_section).get(CONFIG.audio_artist)
      log(2, 'Client: %s (%s)' % (client.title, client.product))
      log(2, 'Capabilities: %s' % client.protocolCapabilities)
      # Move around a bit
      log(2, 'Browsing around..')
      client.moveDown(); time.sleep(0.5)
      client.moveDown(); time.sleep(0.5)
      client.moveDown(); time.sleep(0.5)
      client.select(); time.sleep(3)
      client.moveRight(); time.sleep(0.5)
      client.moveRight(); time.sleep(0.5)
      client.moveLeft(); time.sleep(0.5)
      client.select(); time.sleep(3)
      client.goBack(); time.sleep(1)
      client.goBack(); time.sleep(3)
      # Go directly to media
      log(2, 'Navigating to %s..' % episode.title)
      client.goToMedia(episode); time.sleep(5)
      log(2, 'Navigating to %s..' % artist.title)
      client.goToMedia(artist); time.sleep(5)
      log(2, 'Navigating home..')
      client.goToHome(); time.sleep(5)
      client.moveUp(); time.sleep(0.5)
      client.moveUp(); time.sleep(0.5)
      client.moveUp(); time.sleep(0.5)
      # Show context menu
      client.contextMenu(); time.sleep(3)
      client.goBack(); time.sleep(5)
  
  
  @register()
  def test_video_playback(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      _video_playback(plex, client)
  
  
  @register()
  def test_video_playback_via_proxy(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      client.proxyThroughServer()
      _video_playback(plex, client)
  
  
  def _video_playback(plex, client):
      try:
          mtype = 'video'
          movie = plex.library.section(CONFIG.movie_section).get(CONFIG.movie_title)
          subs = [s for s in movie.subtitleStreams if s.language == 'English']
          log(2, 'Client: %s (%s)' % (client.title, client.product))
          log(2, 'Capabilities: %s' % client.protocolCapabilities)
          log(2, 'Playing to %s..' % movie.title)
          client.playMedia(movie); time.sleep(5)
          log(2, 'Pause..')
          client.pause(mtype); time.sleep(2)
          log(2, 'Step Forward..')
          client.stepForward(mtype); time.sleep(5)
          log(2, 'Play..')
          client.play(mtype); time.sleep(3)
          log(2, 'Seek to 10m..')
          client.seekTo(10*60*1000); time.sleep(5)
          log(2, 'Disable Subtitles..')
          client.setSubtitleStream(0, mtype); time.sleep(10)
          log(2, 'Load English Subtitles %s..' % subs[0].id)
          client.setSubtitleStream(subs[0].id, mtype); time.sleep(10)
          log(2, 'Stop..')
          client.stop(mtype); time.sleep(1)
      finally:
          log(2, 'Cleanup: Marking %s watched.' % movie.title)
          movie.markWatched()
  
  
  @register()
  def test_client_timeline(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      _test_timeline(plex, client)
  
  
  @register()
  def test_client_timeline_via_proxy(account, plex):
      client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
      client.proxyThroughServer()
      _test_timeline(plex, client)
  
  
  def _test_timeline(plex, client):
      try:
          mtype = 'video'
          client = getclient(CONFIG.client, CONFIG.client_baseurl, plex)
          movie = plex.library.section(CONFIG.movie_section).get(CONFIG.movie_title)
          time.sleep(30)  # previous test may have played media..
          playing = client.isPlayingMedia()
          log(2, 'Playing Media: %s' % playing)
          assert playing is False, 'isPlayingMedia() should have returned False.'
          client.playMedia(movie); time.sleep(30)
          playing = client.isPlayingMedia()
          log(2, 'Playing Media: %s' % playing)
          assert playing is True, 'isPlayingMedia() should have returned True.'
          client.stop(mtype); time.sleep(30)
          playing = client.isPlayingMedia()
          log(2, 'Playing Media: %s' % playing)
          assert playing is False, 'isPlayingMedia() should have returned False.'
      finally:
          log(2, 'Cleanup: Marking %s watched.' % movie.title)
          movie.markWatched()