Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create ShakaPlayer Controller #758

Merged
merged 5 commits into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions examples/shaka_drm_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
"""
Example on how to use the Shaka Controller to play an URL.


"""
# pylint: disable=invalid-name

import argparse
import logging
import sys
from time import sleep

import zeroconf

import pychromecast
from pychromecast import quick_play


# Change to the friendly name of your Chromecast
CAST_NAME = "Living Room"

# Change to an audio or video url
# Sample DRM request from https://reference.dashif.org/dash.js/latest/samples/drm/clearkey.html
MEDIA_URL = "https://media.axprod.net/TestVectors/v7-MultiDRM-SingleKey/Manifest_1080p_ClearKey.mpd"

parser = argparse.ArgumentParser(
description="Example on how to use the Shaka Controller to play an URL with DRM."
)
parser.add_argument(
"--cast", help='Name of cast device (default: "%(default)s")', default=CAST_NAME
)
parser.add_argument(
"--known-host",
help="Add known host (IP), can be used multiple times",
action="append",
)
parser.add_argument("--show-debug", help="Enable debug log", action="store_true")
parser.add_argument(
"--show-zeroconf-debug", help="Enable zeroconf debug log", action="store_true"
)
parser.add_argument(
"--url", help='Media url (default: "%(default)s")', default=MEDIA_URL
)
args = parser.parse_args()

if args.show_debug:
logging.basicConfig(level=logging.DEBUG)
if args.show_zeroconf_debug:
print("Zeroconf version: " + zeroconf.__version__)
logging.getLogger("zeroconf").setLevel(logging.DEBUG)

# pylint: disable=unbalanced-tuple-unpacking
chromecasts, browser = pychromecast.get_listed_chromecasts(
friendly_names=[args.cast], known_hosts=args.known_host
)
if not chromecasts:
print(f'No chromecast with name "{args.cast}" discovered')
sys.exit(1)

cast = list(chromecasts)[0]
# Start socket client's worker thread and wait for initial status update
cast.wait()
print(f'Found chromecast with name "{args.cast}", attempting to play "{args.url}"')

# Take customData from shaka player appData object sent in init message to chromecast
app_name = "shaka"
app_data = {
"media_id": args.url,
"media_type": "",
"stream_type": "LIVE",
"media_info": {
"customData": {
"asset": {
"name": "Custom DRM Video",
"shortName": "",
"iconUri": "",
"manifestUri": "https://media.axprod.net/TestVectors/v7-MultiDRM-SingleKey/Manifest_1080p_ClearKey.mpd",
"source": "Custom",
"focus": False,
"disabled": False,
"extraText": [],
"extraThumbnail": [],
"certificateUri": None,
"description": None,
"isFeatured": False,
"drm": ["No DRM protection"],
"features": ["VOD"],
"licenseServers": {"__type__": "map"},
"licenseRequestHeaders": {"__type__": "map"},
"requestFilter": None,
"responseFilter": None,
"clearKeys": {"__type__": "map"},
"extraConfig": {
"drm": {
"clearKeys": {
"nrQFDeRLSAKTLifXUIPiZg": "FmY0xnWCPCNaSpRG-tUuTQ"
}
}
},
"adTagUri": None,
"imaVideoId": None,
"imaAssetKey": None,
"imaContentSrcId": None,
"imaManifestType": None,
"mediaTailorUrl": None,
"mediaTailorAdsParams": None,
"mimeType": None,
"mediaPlaylistFullMimeType": None,
"storedProgress": 1,
"storedContent": None,
}
}
},
}

quick_play.quick_play(cast, app_name, app_data)

sleep(10)

browser.stop_discovery()
1 change: 1 addition & 0 deletions pychromecast/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
APP_BUBBLEUPNP = "3927FA74"
APP_BBCSOUNDS = "03977A48"
APP_BBCIPLAYER = "5E81F6DB"
APP_SHAKA = "07AEE832"


def get_possible_app_ids():
Expand Down
13 changes: 13 additions & 0 deletions pychromecast/controllers/shaka.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
Simple Controller to use Shaka as a media controller.
"""

from ..config import APP_SHAKA
from .media import BaseMediaPlayer


class ShakaController(BaseMediaPlayer):
"""Controller to interact with Shaka app namespace."""

def __init__(self):
super().__init__(supporting_app_id=APP_SHAKA)
3 changes: 3 additions & 0 deletions pychromecast/quick_play.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from .controllers.supla import SuplaController
from .controllers.yleareena import YleAreenaController
from .controllers.youtube import YouTubeController
from .controllers.shaka import ShakaController


def quick_play(cast, app_name, data):
Expand Down Expand Up @@ -69,6 +70,8 @@ def quick_play(cast, app_name, data):
controller = YleAreenaController()
elif app_name == "youtube":
controller = YouTubeController()
elif app_name == "shaka":
controller = ShakaController()
else:
raise NotImplementedError()

Expand Down