Example #1
0
async def show_source_properties_dialog(conn, delay):
    ss = SourcesService(conn)
    sources = await ss.get_sources()
    first_source = sources[0]
    first_source_id = first_source.source_id
    print("Please cancel the 'properties' dialogue for:")
    # TODO: When str_source_multiline is available, print it here.
    await ss.show_source_properties(first_source_id)
Example #2
0
async def manipulate_selected(conn) -> None:
    sts = SelectionService(conn)
    sos = SourcesService(conn)
    ss = ScenesService(conn)

    path = Path(__file__).parent / "testpattern.jpg"

    async with TestScene(conn) as scene:
        await ss.make_scene_active(scene.source_id)
        new_source = await sos.create_source(
            "test pattern 2", "image_source", {"file": str(path)}, options=None
        )

        first = await scene.add_source(source_id=new_source.source_id, options=None)
        await sts.select_all()
        print(
            "Bounding rectangle of original test pattern", await sts.get_bounding_rect()
        )
        # Centre it.
        await sts.center_on_screen()
        # Flip it
        await sts.flip_x()
        await sts.flip_y()
        # Enlarge it
        await sts.fit_to_screen()

        # Scale it - no origin
        # Send right code, but doesn't display for unclear reasons.
        # Tried treating as factor and as final size.
        await sts.scale(IVec2(5, 5))
        await sts.scale(IVec2(1, 1), IVec2(2, 2))
        await sts.scale_with_offset(IVec2(10, 10), IVec2(2, 2))
        # Enlarge it
        await sts.stretch_to_screen()
        await sts.reset_transform()
        await sts.rotate(45)
        await sts.set_transform(dict(rotation=12))
        await sts.set_visibility(False)
        await sts.set_visibility(True)
        await sts.set_stream_visible(False)
        await sts.set_stream_visible(True)
        await sts.set_recording_visible(False)
        await sts.set_settings(dict(locked=True))
        await sts.set_settings(dict(locked=False, recordingVisible=True))
Example #3
0
async def modify_scene_nodes(conn):
    ss = SourcesService(conn)
    source = await ss.create_source(
        name="Exercise Browser Source",
        type_="browser_source",
        settings={"url": "http://twitter.com/PuzzlingOldMan"},
        options=ISourceAddOptions(channel=None, is_temporary=False),
    )
    print("Added source", source)

    async with TestScene(conn) as ts:
        print("Scene added.")
        await ts.make_active()
        print("Scene made active (via scene).")
        folder = await ts.create_folder("test_folder")
        print("Added folder")
        scene_node = await ts.add_source(source.source_id)
        print("Created scene_node from source")
        # Add node to folder.
        await folder.add(scene_node.scene_item_id)

        # Can't figure out how to create a subfolder!
        # subfolder = await ts.create_folder("sub_folder")
        # # Make node for source.
        # print("Before: Subfolder's parent: ", await subfolder.get_parent())
        # await subfolder.set_parent(folder.resource_id)
        # print("Added subfolder to folder")
        # print("After: Subfolder's parent: ", await subfolder.get_parent())

        print("Name before:", folder.name)
        await folder.set_name("Test folder renamed")
        print("Name after:", folder.name)

        # This exercises get_folders and get_items
        print(await pp.str_scene_multiline(ts,
                                           indent="",
                                           as_tree=True,
                                           folders_first=True))

        print("Before scaling", scene_node.transform)
        await scene_node.set_scale(IVec2(1.5, 2.0))
        print("After scaling - proxy value", scene_node.name,
              scene_node.transform)
        items = await folder.get_items()
        assert len(items) == 1
        refetched_scene_node = items[0]
        print(
            "After scaling - refetched value",
            refetched_scene_node.name,
            refetched_scene_node.transform,
        )
        # Why does the position change? Checked the data being transmitted and it
        # appears to be a bug in StreamLabs.

        print(
            "Before setting",
            scene_node.locked,
            scene_node.visible,
            scene_node.stream_visible,
        )
        await scene_node.set_settings(
            dict(locked=True, visible=False, stream_visible=False))
        print(
            "After setting - proxy value",
            scene_node.locked,
            scene_node.visible,
            scene_node.stream_visible,
        )
        items = await folder.get_items()
        assert len(items) == 1
        refetched_scene_node = items[0]
        print(
            "After setting - refetched value",
            refetched_scene_node.locked,
            refetched_scene_node.visible,
            refetched_scene_node.stream_visible,
        )

        await asyncio.sleep(2)
    print("Scene deleted, old scene made active (via sceneservice)")
Example #4
0
async def direct_selection(conn) -> None:
    sts = SelectionService(conn)
    sos = SourcesService(conn)
    ss = ScenesService(conn)

    path = Path(__file__).parent / "testpattern.jpg"

    async with TestScene(conn) as scene:
        await ss.make_scene_active(scene.source_id)
        new_source = await sos.create_source(
            "test pattern", "image_source", {"file": str(path)}, options=None
        )

        first = await scene.add_source(source_id=new_source.source_id, options=None)
        await scene.add_source(source_id=new_source.source_id, options=None)
        middle = await scene.add_source(source_id=new_source.source_id, options=None)
        await scene.add_source(source_id=new_source.source_id, options=None)
        last = await scene.add_source(source_id=new_source.source_id, options=None)

        # We have 5 entries for test patterns. The last added is selected.
        selected_ids = await sts.get_ids()
        assert len(selected_ids) == 1
        assert first.id_ not in selected_ids
        assert middle.id_ not in selected_ids
        assert last.id_ in selected_ids

        # Select them all
        await sts.select_all()
        selected_ids = await sts.get_ids()
        assert len(selected_ids) == 5
        assert first.id_ in selected_ids
        assert middle.id_ in selected_ids
        assert last.id_ in selected_ids

        # Count them
        assert (await sts.get_size()) == 5

        # Deselect two.
        await sts.deselect([first.id_, last.id_])
        selected_ids = await sts.get_ids()
        assert first.id_ not in selected_ids
        assert middle.id_ in selected_ids
        assert last.id_ not in selected_ids

        # Repeat the check using is_selected.
        assert await sts.is_selected(middle.id_)
        assert not await sts.is_selected(last.id_)

        # Invert the selection.
        await sts.invert()
        selected_ids = await sts.get_ids()
        assert first.id_ in selected_ids
        assert middle.id_ not in selected_ids
        assert last.id_ in selected_ids

        # Select one more.
        await sts.add([middle.id_])
        selected_ids = await sts.get_ids()
        assert first.id_ in selected_ids
        assert middle.id_ in selected_ids
        assert last.id_ in selected_ids

        # Inspect via get_model
        model = await sts.get_model()
        assert model.last_selected_id == middle.id_
        assert set(model.selected_ids) == set([first.id_, middle.id_, last.id_])
        # Select only one
        await sts.select([middle.id_])
        selected_ids = await sts.get_ids()
        assert first.id_ not in selected_ids
        assert middle.id_ in selected_ids
        assert last.id_ not in selected_ids

        scene_items = await sts.get_items()
        assert len(scene_items) == 1
        assert scene_items[0].id_ == middle.id_

        await sts.reset()
        scene_items = await sts.get_items()
        assert not scene_items
Example #5
0
async def modify_scene_nodes(conn):
    ss = SourcesService(conn)
    source = await ss.create_source(
        name="Exercise Browser Source",
        type_="browser_source",
        settings={"url": "http://twitter.com/PuzzlingOldMan"},
        options=ISourceAddOptions(channel=None, is_temporary=False),
    )
    print("Added source", source)
    path = Path(__file__).parent / "testpattern.jpg"

    source = await ss.create_source("test pattern",
                                    "image_source", {"file": str(path)},
                                    options=None)

    async with TestScene(conn) as ts:
        print("Scene added.")
        await ts.make_active()
        print("Scene made active (via scene).")
        folder = await ts.create_folder("test_folder")
        print("Added folder")
        scene_node = await ts.add_source(source.source_id)
        print("Created scene_node from source. Here is the default transform:")
        print(scene_node.transform)

        # Make sure that the position is an integer (see Issue #7 in GitHub)
        assert scene_node.transform.position.x == 0

        # Add node to folder.
        await folder.add(scene_node.scene_item_id)

        # Can't figure out how to create a subfolder!
        # subfolder = await ts.create_folder("sub_folder")
        # # Make node for source.
        # print("Before: Subfolder's parent: ", await subfolder.get_parent())
        # await subfolder.set_parent(folder.resource_id)
        # print("Added subfolder to folder")
        # print("After: Subfolder's parent: ", await subfolder.get_parent())

        print("Name before:", folder.name)
        await folder.set_name("Test folder renamed")
        print("Name after:", folder.name)

        # This exercises get_folders and get_items
        print(await pp.str_scene_multiline(ts,
                                           indent="",
                                           as_tree=True,
                                           folders_first=True))

        # Exercise scaling
        print("Before scaling", scene_node.transform)
        await scene_node.set_scale(IVec2(0.5, 0.8))
        print("After scaling - proxy value", scene_node.name,
              scene_node.transform)
        items = await folder.get_items()
        assert len(items) == 1
        refetched_scene_node = items[0]
        print(
            "After scaling - refetched value",
            refetched_scene_node.name,
            refetched_scene_node.transform,
        )
        # Why does the position change? Checked the data being transmitted and it
        # appears to be a bug in StreamLabs.

        print("Wait a moment for the pattern to appear.")
        await asyncio.sleep(5)
        print(
            "Before setting",
            scene_node.locked,
            scene_node.visible,
            scene_node.stream_visible,
        )

        print("Pattern should now disappear from the screen.")
        await scene_node.set_settings(
            dict(locked=True, visible=False, stream_visible=False))
        print(
            "After setting - proxy value",
            scene_node.locked,
            scene_node.visible,
            scene_node.stream_visible,
        )
        await asyncio.sleep(15)

        print("Pattern should now reappear on screen (not in stream though).")
        assert scene_node.visible == False
        await scene_node.set_visibility(visible=True)
        assert scene_node.visible == True

        await asyncio.sleep(5)

        items = await folder.get_items()
        assert len(items) == 1
        refetched_scene_node = items[0]
        print(
            "After setting - refetched value",
            refetched_scene_node.locked,
            refetched_scene_node.visible,
            refetched_scene_node.stream_visible,
        )

        await asyncio.sleep(2)
    print("Scene deleted, old scene made active (via sceneservice)")
Example #6
0
async def show_add_showcase_dialog(conn, delay):
    ss = SourcesService(conn)
    print("Please note the 'Select source type' dialogue.")
    await ss.show_showcase()
    await asyncio.sleep(delay)
Example #7
0
async def show_add_source_dialog(conn, delay):
    ss = SourcesService(conn)
    print("Please note the 'Name source' dialogue.")
    await ss.show_add_source("This doesn't matter?")
    await asyncio.sleep(delay)
Example #8
0
async def show_all_sources(conn):
    ss = SourcesService(conn)
    sources = await ss.get_sources()
    print("All Sources")
    for source in sources:
        print(await pp.str_source_multiline(source, ""))
Example #9
0
async def add_source(conn):
    ss = SourcesService(conn)
    events = {}

    async def callback(key, value):
        events[key] = events.get(key, 0) + 1

    await ss.source_added.subscribe(callback)
    await ss.source_removed.subscribe(callback)
    await ss.source_updated.subscribe(callback)

    source = await ss.create_source(
        name="Exercise Browser Source",
        type_="browser_source",
        settings={"url": "http://twitter.com/PuzzlingOldMan"},
        # Tested with is_temporary = True, and it wasn't found in search,
        # which presumably is correct.
        options=ISourceAddOptions(channel=None, is_temporary=False),
    )

    print("Created browser source:")
    print(await pp.str_source_multiline(source, ""))

    await asyncio.sleep(0.1)
    assert events == {"SourcesService.sourceAdded": 1}

    # Refetch the same source by name
    for source_3 in await ss.get_sources_by_name(source.name):
        assert source_3.name == source.name
        if source_3.source_id == source.source_id:
            break
    else:
        assert False, "Search by name failed"

    await source.set_name("Exercise Browser Source 2")

    await asyncio.sleep(0.1)
    assert events == {
        "SourcesService.sourceAdded": 1,
        "SourcesService.sourceUpdated": 1,
    }

    # Refetch the same source by id
    source_2 = await ss.get_source(source.id)
    assert source_2.name == "Exercise Browser Source 2"

    await ss.remove_source(source.source_id)
    assert events == {
        "SourcesService.sourceAdded": 1,
        "SourcesService.sourceUpdated": 1,
        "SourcesService.sourceRemoved": 1,
    }

    file_source = await ss.add_file(
            Path(__file__).parent / "testpattern.jpg")

    print("Created source from file:")
    print(await pp.str_source_multiline(file_source, ""))

    await ss.remove_source(file_source.source_id)
    assert events == {
        "SourcesService.sourceAdded": 2,
        "SourcesService.sourceUpdated": 1,
        "SourcesService.sourceRemoved": 2,
    }
Example #10
0
async def show_all_source_types(conn):
    ss = SourcesService(conn)
    print("All Source Types")
    for item in await ss.get_available_sources_types_list():
        print(f"+- {item.value:23s}: {item.description}")