213 lines
6.1 KiB
Python
213 lines
6.1 KiB
Python
from .mpris import setup_mpris
|
|
from .playerctl import PlayerctlCli
|
|
import pytest
|
|
import asyncio
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_follow(bus_address):
|
|
player1 = 'test1'
|
|
[mpris1] = await setup_mpris(player1, bus_address=bus_address)
|
|
|
|
playerctl = PlayerctlCli(bus_address)
|
|
pctl_cmd = 'metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
|
|
proc = await playerctl.start(pctl_cmd)
|
|
|
|
await mpris1.set_artist_title('artist', 'title')
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist - title'
|
|
|
|
await mpris1.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist2 - title2'
|
|
|
|
await mpris1.clear_metadata()
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: -'
|
|
|
|
await mpris1.set_artist_title('artist3', 'title3')
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist3 - title3'
|
|
|
|
await mpris1.disconnect()
|
|
|
|
line = await proc.queue.get()
|
|
assert line == ''
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_follow_selection(bus_address):
|
|
player1 = 'test1'
|
|
player2 = 'test2'
|
|
player3 = 'test3'
|
|
player4 = 'test4'
|
|
[mpris1, mpris2, mpris3,
|
|
mpris4] = await setup_mpris(player1,
|
|
player2,
|
|
player3,
|
|
player4,
|
|
bus_address=bus_address)
|
|
|
|
await mpris1.set_artist_title('artist', 'title')
|
|
|
|
playerctl = PlayerctlCli(bus_address)
|
|
pctl_cmd = '--player test3,test2,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
|
|
proc = await playerctl.start(pctl_cmd)
|
|
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist - title'
|
|
|
|
# player4 is ignored
|
|
await mpris4.set_artist_title('artist', 'title')
|
|
assert proc.queue.empty()
|
|
|
|
# setting metadata the same twice doesn't print
|
|
await mpris1.set_artist_title('artist', 'title')
|
|
assert proc.queue.empty()
|
|
|
|
await mpris2.set_artist_title('artist', 'title')
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist - title'
|
|
|
|
# player2 takes precedence
|
|
await mpris1.set_artist_title('artist2', 'title2')
|
|
assert proc.queue.empty()
|
|
|
|
await mpris3.set_artist_title('artist', 'title')
|
|
line = await proc.queue.get()
|
|
assert line == 'test3: artist - title'
|
|
|
|
# player 3 takes precedence
|
|
await mpris2.set_artist_title('artist2', 'title2')
|
|
assert proc.queue.empty()
|
|
|
|
# when bus3 disconnects, it should show the next one
|
|
await mpris3.disconnect()
|
|
|
|
await mpris2.ping()
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist2 - title2'
|
|
|
|
# same for bus2
|
|
await mpris2.disconnect()
|
|
await mpris1.ping()
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist2 - title2'
|
|
|
|
await mpris1.disconnect()
|
|
line = await proc.queue.get()
|
|
assert line == ''
|
|
|
|
await mpris4.disconnect()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_follow_selection_any(bus_address):
|
|
player1 = 'test1'
|
|
player2 = 'test2'
|
|
player3 = 'test3'
|
|
player4 = 'test4'
|
|
[mpris1, mpris2, mpris3,
|
|
mpris4] = await setup_mpris(player1,
|
|
player2,
|
|
player3,
|
|
player4,
|
|
bus_address=bus_address)
|
|
|
|
playerctl = PlayerctlCli(bus_address)
|
|
pctl_cmd = '--player test3,%any,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
|
|
proc = await playerctl.start(pctl_cmd)
|
|
|
|
# test3 takes first precedence
|
|
await mpris3.set_artist_title('artist', 'title')
|
|
line = await proc.queue.get()
|
|
assert line == 'test3: artist - title', proc.queue
|
|
|
|
await mpris2.set_artist_title('artist', 'title')
|
|
assert proc.queue.empty()
|
|
|
|
await mpris1.set_artist_title('artist', 'title')
|
|
assert proc.queue.empty()
|
|
|
|
await mpris3.disconnect()
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist - title'
|
|
|
|
await mpris2.disconnect()
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist - title'
|
|
|
|
await mpris1.disconnect()
|
|
line = await proc.queue.get()
|
|
assert line == ''
|
|
|
|
await mpris4.disconnect()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_follow_all_players(bus_address):
|
|
player1 = 'test1'
|
|
player2 = 'test2'
|
|
player3 = 'test3'
|
|
player4 = 'test4'
|
|
[mpris1, mpris2, mpris3,
|
|
mpris4] = await setup_mpris(player1,
|
|
player2,
|
|
player3,
|
|
player4,
|
|
bus_address=bus_address)
|
|
|
|
await asyncio.gather(*[
|
|
mpris.set_artist_title('artist', 'title')
|
|
for mpris in [mpris1, mpris2, mpris3, mpris4]
|
|
])
|
|
|
|
playerctl = PlayerctlCli(bus_address)
|
|
pctl_cmd = '--all-players --player test3,test2,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
|
|
proc = await playerctl.start(pctl_cmd)
|
|
|
|
# player4 is ignored
|
|
await mpris4.set_artist_title('artist', 'title')
|
|
assert proc.queue.empty()
|
|
|
|
# no precedence, just whoever changes metadata last
|
|
await mpris1.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist2 - title2'
|
|
|
|
await mpris2.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist2 - title2'
|
|
|
|
await mpris3.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test3: artist2 - title2'
|
|
|
|
await mpris2.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist2 - title2'
|
|
|
|
await mpris1.set_artist_title('artist2', 'title2')
|
|
line = await proc.queue.get()
|
|
assert line == 'test1: artist2 - title2'
|
|
|
|
await mpris1.disconnect()
|
|
await mpris4.ping()
|
|
|
|
line = await proc.queue.get()
|
|
assert line == 'test2: artist2 - title2'
|
|
|
|
await mpris2.disconnect()
|
|
await mpris4.ping()
|
|
|
|
line = await proc.queue.get()
|
|
assert line == 'test3: artist2 - title2'
|
|
|
|
await mpris3.disconnect()
|
|
await mpris4.ping()
|
|
|
|
line = await proc.queue.get()
|
|
assert line == ''
|
|
|
|
await mpris4.disconnect()
|