Skip to content

Instantly share code, notes, and snippets.

@KennethNielsen
Created March 4, 2015 21:15
Show Gist options
  • Save KennethNielsen/cba1a14b8a83f44cab3e to your computer and use it in GitHub Desktop.
Save KennethNielsen/cba1a14b8a83f44cab3e to your computer and use it in GitHub Desktop.
New music service test script
# -*- coding: utf-8 -*-
from __future__ import print_function
from pprint import pprint
import time
import traceback
from soco import SoCo
import soco
from soco.music_services import MusicService
### EDIT HERE START
SPEAKER_IP = '192.168.?.?'
# Include enough search terms here, to make sure you get a hit in all categories with all services
SEARCH_TERMS = ['hit', 'b']
### EDIT HERE END
results = []
def res(description, result):
print(description, result)
results.append((description, result))
all_services = MusicService.get_all_music_services_names()
res('all_services', 'OK' if len(all_services) > 0 else 'FAILED')
def test_music_service(service):
print()
init_str = 'Instantiate {}'.format(service)
try:
musicservice = MusicService(service)
print(musicservice)
res(init_str, 'OK')
except soco.exceptions.SoCoUPnPException:
res(init_str, 'FAILED')
return
test_str = '{} {{}}'.format(service)
root = musicservice.get_metadata(item_id='root')
res(test_str.format('get_metadata root'), 'OK' if root['count'] > 0 else 'FAILED')
if root['count'] == 0:
return
for item in root['mediaCollection']:
try:
musicservice.get_metadata(item_id=item['id'])
except:
res(test_str.format('get_metadata on items in root'), 'FAILED')
break
else:
res(test_str.format('get_metadata on items in root'), 'OK')
try:
search_categories = musicservice.available_search_categories
res(test_str.format('available_search_categories'), 'OK')
except:
res(test_str.format('available_search_categories'), 'FAILED')
return
for search in search_categories:
time.sleep(0.5)
try:
for search_term in SEARCH_TERMS:
search_res = musicservice.search(search, term=search_term)
if search_res['count'] > 0:
break
res(test_str.format('=== search({})'.format(search)), 'OK')
except:
res(test_str.format('=== search({})'.format(search)), 'FAILED')
continue
items = None
type_ = None
for key in ['mediaMetadata', 'mediaCollection']:
if key in search_res:
if items is not None:
raise Exception("Bad search")
items = search_res[key]
type_ = key
if items is not None:
res(test_str.format('results in search'), 'OK')
else:
res(test_str.format('results in search'), 'FAILED')
continue
for item in items:
try:
time.sleep(0.5)
musicservice.get_metadata(item_id=item['id'])
res(test_str.format('get_metadata on {}'.format(search)), 'OK')
break
except Exception as e:
if isinstance(e, soco.exceptions.MusicServiceException) and\
search == 'tracks':
res(test_str.format('get_metadata on {}'.format(search)),
'ACCEPTABLE EXCEPTION')
else:
res(test_str.format('get_metadata on {}'.format(search)), 'FAILED')
print(traceback.format_exc())
break
# Assume we can only ask for media_metadata and uri on tracks
if type_ == 'mediaCollection':
continue
for item in items:
try:
time.sleep(0.5)
musicservice.get_media_metadata(item_id=item['id'])
res(test_str.format('get_media_metadata on {}'.format(search)), 'OK')
break
except:
res(test_str.format('get_media_metadata on {}'.format(search)), 'FAILED')
break
for item in items:
try:
time.sleep(0.5)
musicservice.get_media_uri(item_id=item['id'])
res(test_str.format('get_media_uri on {}'.format(search)), 'OK')
break
except:
res(test_str.format('get_media_uri on {}'.format(search)), 'FAILED')
break
subscribed = MusicService.get_subscribed_services_names()
res('get_subscribed_music_services', 'OK' if len(subscribed) > 0 else 'FAILED')
for service in subscribed:
test_music_service(service)
print('\n### SUMMARY')
for result in results:
if result[0].startswith('Instantiate'):
print()
print('{:.<60}:{}'.format(*result))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment