forked from tuna/gdanmaku
/
danmaku.py
executable file
·118 lines (94 loc) · 2.95 KB
/
danmaku.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
#!/usr/bin/env python2
# -*- coding:utf-8 -*-
import signal
import json
import argparse
import threading
import requests
from settings import load_config
from app import GDanmakuApp
from server_selection import ServerSelectionWindow
from danmaku_ui import Danmaku
from gi.repository import Gtk, GLib, GObject
class Main(object):
def __init__(self, server=None):
self.server = server
server_selection = ServerSelectionWindow(self.server)
server_selection.connect('server-selected', self.on_server_selected)
self.app = GDanmakuApp(self)
self.thread_sub = None
self.enabled = True
self.options = load_config()
self.live_danmakus = {}
def _subscribe_danmaku(self, server):
print("subscribing from server: {}".format(server))
while 1:
try:
res = requests.get(server)
except requests.exceptions.ConnectionError:
continue
if res.status_code == 200 and res.text:
try:
dm_opts = json.loads(res.text)
except:
continue
else:
GLib.idle_add(self.new_danmaku, dm_opts)
def new_danmaku(self, dm_opts):
if not self.enabled:
return
for opt in dm_opts:
try:
dm = Danmaku(**opt)
dm.connect('delete-event', self.on_danmaku_delete)
except Exception as e:
print(e)
continue
self.live_danmakus[id(dm)] = dm
def on_danmaku_delete(self, dm, event):
self.live_danmakus.pop(id(dm))
def toggle_danmaku(self):
self.enabled = not self.enabled
if not self.enabled:
for _, dm in self.live_danmakus.iteritems():
dm.hide()
dm._clean_exit()
def on_server_selected(self, widget, server):
thread_sub = threading.Thread(
target=self._subscribe_danmaku, args=(server, ))
thread_sub.daemon = True
thread_sub.start()
self.thread_sub = thread_sub
def run(self):
GObject.threads_init()
Gtk.main()
def app_config():
from config_panel import ConfigPanel
from gi.repository import Gtk
ConfigPanel()
Gtk.main()
def main():
options = load_config()
parser = argparse.ArgumentParser(prog="gdanmaku")
parser.add_argument(
"--server",
type=str,
default=options["http_stream_server"],
help="danmaku stream server"
)
parser.add_argument(
'--config',
action="store_true",
help="run configuration window"
)
args = parser.parse_args()
signal.signal(signal.SIGINT, signal.SIG_DFL)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
if args.config:
app_config()
else:
main_app = Main(args.server)
main_app.run()
if __name__ == '__main__':
main()
# vim: ts=4 sw=4 sts=4 expandtab