-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscheduler.py
165 lines (135 loc) · 4.32 KB
/
scheduler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import asyncio
import random
import time
import os
import logging
from bilibili_api import live
from threading import Thread, Lock
import time
import start
start.get_default_info()
import wordpicker
import utils
import globaler as gl
import ffmpeg_cmd
room = live.LiveDanmaku(room_display_id=gl.room_id)
lock = Lock()
time_last_pop = time.time()
#主播放循环
async def music_player():
while True:
try:
code, selected_music = choose_music()
_, duration = await ffmpeg_cmd.get_vidoe_info(selected_music)
time_point1 = time.time()
logging.info("playing " + selected_music + " music_duration: " + str(duration) + " second")
if not os.path.exists('./video/' + selected_music + '.flv'):
logging.warning("No music:" + selected_music)
continue
await begin_live(selected_music)
time_point2 = time.time()
real_duration = time_point2 - time_point1
while real_duration < 0.9 * float(duration):
try:
time_point1 = time.time()
await ffmpeg_cmd.push_stream(selected_music, real_duration)
time_point2 = time.time()
real_duration = real_duration + time_point2 - time_point1
except:
break
logging.info("music real play time: " + str(real_duration))
if code:
with lock:
gl.called_list.pop(0)
if code:
utils.delete_music(selected_music)
except Exception as e:
logging.error(e)
break
#开播
async def begin_live(music_name):
try:
logging.info("live start")
await ffmpeg_cmd.start_live(music_name)
except Exception as e:
logging.error(e)
#点歌循环
@room.on('DANMU_MSG')
async def call_list(event):
with lock:
code, music_name, usr_info = await wordpicker.analysis_danmuku(event)
if code == -1:
return 0
if gl.check_music_name(music_name):
with lock:
await wordpicker.double_music_fault(usr_info)
gl.clean_fault_music(music_name)
return 0
with lock:
gl.download_list.append(music_name)
task = video_composer(music_name, usr_info)
asyncio.gather(task)
#添加一首 music
async def add_music(music_name):
with lock:
gl.called_list.append(music_name)
#音乐下载及封装
async def video_composer(music_name, usr_info):
download_code, real_music_name = await wordpicker.music_downloader(music_name)
if download_code == -1:
await wordpicker.download_fault(usr_info, music_name)
with lock:
gl.clean_fault_music(music_name)
return -1
with lock:
await wordpicker.success_danmuku(usr_info, music_name)
video_compose_code, msg = await ffmpeg_cmd.make_video_2(music_name, real_music_name)
if video_compose_code == -1:
with lock:
gl.clean_fault_music(music_name)
print("video composer error : " + str(msg))
return -1
print("video composer success")
count = 0
while gl.download_list[0] != music_name:
await asyncio.sleep(10)
if gl.download_list[1] == music_name:
count += 1
if count == 30:
pop_fist_music()
count = 0
await add_music(music_name)
with lock:
gl.download_list.pop(0)
#选择下一个音乐
#返回选择的 music_name
def choose_music():
#print(gl.called_list)
if not gl.called_list:
num = random.randint(0, len(gl.default_list)-1)
return 0, gl.default_list[num]
else:
with lock:
res = gl.called_list[0];
return 1, res
#排除排队bug
def pop_fist_music():
time_curr = time.time()
if time_curr - time_last_pop > 300:
with lock:
gl.download_list.pop(0)
time_last_pop = time_curr
async def tasks():
#room = live.LiveDanmaku(gl.room_id)
room_connect = room.connect()
await asyncio.gather(room_connect)
def run_bili_loop():
asyncio.run(tasks())
#print("nice")
def setup():
t1 = Thread(target=run_bili_loop, args=())
t1.start()
asyncio.run(music_player())
t1.join()
if __name__ == "__main__":
setup()