#!/usr/bin/env python3
import os
import socketserver
import threading
import json
import atexit
from RPi import GPIO
from omxplayer.player import OMXPlayer
from pathlib import Path
from time import sleep
# PATH需要修改成树莓派正确的存放目录
AUDIO_PATH = "/var/homeshare/DLNA/Music/"
VIDEO_PATH = "/var/homeshare/DLNA/Video/"
APP_NAME = "OMXPlayer"
TAG = __file__ + ':'
# 全局变量
play = dict({
'volume': 0.1,
'total_time': 0,
'current_time': 0,
'playback_status': 'stop'
})
cmd_update = None
player = None
server = None
class MyServer(socketserver.BaseRequestHandler):
'''
数据接收服务
'''
def handle(self):
conn = self.request
# conn.sendall(bytes(APP_NAME, encoding="utf-8"))
# print("conn is :", self.request) # conn
while True:
try:
ret_bytes = conn.recv(1024)
if not ret_bytes:
break
ret_str = str(ret_bytes, encoding="utf-8")
ret = data_process(ret_str)
print(ret)
conn.sendall(bytes(ret, encoding="utf-8"))
except Exception as e:
print(TAG, 'handle error', e)
break
def data_process(ret_str):
global cmd_update, play
'''
数据JSON/DICT分析处理
'''
ret = 'error'
try:
d = json.loads(ret_str)
if 'app' in d and d['app'] == APP_NAME:
play.update(d)
cmd_update = dict()
cmd_update.update(d)
ret = json.dumps(play)
else:
print(TAG, 'app error:', d)
except Exception as e:
print(TAG, 'json loads error', e)
return ret
# 正常、异常退出处理
@atexit.register
def atexit_fun():
print(TAG + 'i am exit, stack track:')
GPIO.cleanup()
if server is not None:
server.shutdown()
server.server_close()
if player is not None:
player.quit()
def led_run():
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
while True:
GPIO.output(21, GPIO.HIGH)
if 'led_duty' in play:
sleep(0.1 * int(play['led_duty']))
else:
sleep(0.5)
GPIO.output(21, GPIO.LOW)
sleep(0.5)
class Player(OMXPlayer):
def __init__(self, *args, **kwargs):
super(Player, self).__init__(*args, **kwargs)
self.status = True
self.stopEvent = self.stop_event
@staticmethod
def stop_event(obj):
obj.status = False
print('stop_event')
def playback_status(self):
try:
return super(Player, self).playback_status()
except Exception as e:
print(e)
self.status = False
def quit(self):
super(Player, self).quit()
self.status = False
if __name__ == "__main__":
print("OMXPlayer Running...")
# 初始化TCPServer,来接收数据
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = socket.getservbyname("http", "tcp")
s.connect(("www.126.com", port))
ip = s.getsockname()[0]
s.close()
server = socketserver.ThreadingTCPServer((ip, 8080), MyServer)
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
# 初始化LED任务
led_thread = threading.Thread(target=led_run)
led_thread.daemon = True
led_thread.start()
# 播放控制程序
print("wait...", ip)
player = None
# player = Player(Path(AUDIO_PATH + 'a9.mp3'))
#
# while True:
# if player.status:
# try:
# print(player.playback_status())
# except Exception as e:
# print(e)
# sleep(1)
while True:
cmd_update = None
while True:
if cmd_update is not None:
break
else:
if player is not None and player.status:
try:
player['current_time'] = player.position()
player['playback_status'] = player.playback_status()
print(' %s %d %d' % (player['playback_status'], player['total_time'], player['current_time']))
except:pass
else:
play['playback_status'] = 'stop'
play['current_time'] = 0
sleep(0.1)
print('cmd: ', cmd_update)
print('play: ', play)
if player is not None and player.status:
if cmd_update['control'] == 'volume':
player.set_volume(play['volume'])
continue
if player is not None:
player.quit()
player = None
if cmd_update['control'] == 'play':
playname = play['filename'].lower()
filepath = None
file_format = None
if '.mp3' in playname:
filepath = Path(AUDIO_PATH + play['filename'])
file_format = 'AUDIO'
elif '.mp4' in playname or '.avi' in playname or '.rmvb' in playname:
filepath = Path(VIDEO_PATH + play['filename'])
file_format = 'VIDEO'
if file_format is not None:
if not os.path.exists(filepath):
print(TAG, 'file is not exist ', filepath)
filepath = Path('/mnt/usb_flash/' + play['filename'])
if not os.path.exists(filepath):
print(TAG, 'file is not exist ', filepath)
filepath = None
if filepath is not None:
player = Player(filepath)
player.set_volume(play['volume'])
play['total_time'] = player.metadata()['mpris:length']/1000000