# Copyright (c) 2021 by xfangfang. All Rights Reserved.
#
# Using web browser as DLNA media renderer
# This plugin can be used to download media files or get some m3u8 played
#
# Macast Metadata
# Web Renderer
# WebRenderer
# darwin,linux,win32
# 0.2
# 0.7
# xfangfang
# Using web browser as DLNA media renderer, This plugin can be used to download media files or get some m3u8 played.
import os
import sys
import time
import threading
import pyperclip
import cherrypy
import subprocess
import webbrowser
from enum import Enum
from macast import gui, Setting, MenuItem
from macast.renderer import Renderer, RendererSetting
class WebRenderer(Renderer):
def __init__(self):
super(WebRenderer, self).__init__()
self.start_position = 0
self.position_thread_running = True
self.position_thread = threading.Thread(target=self.position_tick, daemon=True)
self.position_thread.start()
self.renderer_setting = WebRendererSetting()
def position_tick(self):
while self.position_thread_running:
time.sleep(1)
self.start_position += 1
sec = self.start_position
position = '%d:%02d:%02d' % (sec // 3600, (sec % 3600) // 60, sec % 60)
self.set_state_position(position)
def set_media_stop(self):
self.set_state_transport('STOPPED')
cherrypy.engine.publish('renderer_av_stop')
def set_media_url(self, url, start=0):
self.set_media_stop()
self.start_position = 0
self.open_browser(url)
self.set_state_transport("PLAYING")
cherrypy.engine.publish('renderer_av_uri', url)
def get_env(self):
# https://github.com/pyinstaller/pyinstaller/issues/3668#issuecomment-742547785
env = Setting.get_system_env()
toDelete = []
for (k, v) in env.items():
if k != 'PATH' and 'tmp' in v:
toDelete.append(k)
for k in toDelete:
env.pop(k, None)
return env
def open_browser(self, url):
if self.renderer_setting.setting_autocopy:
pyperclip.copy(url)
if sys.platform == 'darwin':
subprocess.Popen(['open', url])
elif sys.platform == 'win32':
webbrowser.open(url)
else:
subprocess.Popen(["xdg-open", url], env=self.get_env())
def stop(self):
super(WebRenderer, self).stop()
self.set_media_stop()
print("Web stop")
cherrypy.engine.publish('renderer_av_stop')
def start(self):
super(WebRenderer, self).start()
print("Web start")
class SettingProperty(Enum):
Web_AutoCopy = 1
Web_AutoCopy_Disable = 0
Web_AutoCopy_Enable = 1
class WebRendererSetting(RendererSetting):
def __init__(self):
Setting.load()
self.webAutoCopyItem = None
self.setting_autocopy = Setting.get(SettingProperty.Web_AutoCopy,
SettingProperty.Web_AutoCopy_Enable.value)
def build_menu(self):
self.webAutoCopyItem = MenuItem("Auto Copy Url",
self.on_autocopy_clicked,
checked=self.setting_autocopy)
return [
self.webAutoCopyItem,
]
def on_autocopy_clicked(self, item):
item.checked = not item.checked
self.setting_autocopy = 1 if item.checked else 0
Setting.set(SettingProperty.Web_AutoCopy, self.setting_autocopy)
if __name__ == '__main__':
gui(WebRenderer())