winlin

refine the api server

@@ -548,6 +548,7 @@ class ArmServer: @@ -548,6 +548,7 @@ class ArmServer:
548 data["heartbeat"] = self.heartbeat 548 data["heartbeat"] = self.heartbeat
549 data["heartbeat_h"] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.heartbeat)) 549 data["heartbeat_h"] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.heartbeat))
550 data["summaries"] = "http://%s:1985/api/v1/summaries"%(self.ip) 550 data["summaries"] = "http://%s:1985/api/v1/summaries"%(self.ip)
  551 + data["console"] = "http://ossrs.net/console/ng_index.html#/summaries?host=%s&port=1985"%(self.ip)
551 return data 552 return data
552 553
553 ''' 554 '''
@@ -579,29 +580,6 @@ class RESTServers(object): @@ -579,29 +580,6 @@ class RESTServers(object):
579 if not has_dead_node: 580 if not has_dead_node:
580 break 581 break
581 582
582 - def __json_dump_nodes(self, peers):  
583 - data = []  
584 - for node in peers:  
585 - data.append(node.json_dump())  
586 - return data  
587 -  
588 - def __get_peers_for_play(self, device_id):  
589 - peers = []  
590 - for node in self.__nodes:  
591 - if node.device_id == device_id:  
592 - peers.append(node)  
593 - return peers  
594 -  
595 - def __select_peer(self, peers, device_id):  
596 - target = None  
597 - for peer in peers:  
598 - if target is None or target.clients > peer.clients:  
599 - target = peer  
600 - if target is None:  
601 - return None  
602 - target.clients += 1  
603 - return target.ip  
604 -  
605 ''' 583 '''
606 post to update server ip. 584 post to update server ip.
607 request body: the new raspberry-pi server ip. TODO: FIXME: more info. 585 request body: the new raspberry-pi server ip. TODO: FIXME: more info.
@@ -637,183 +615,21 @@ class RESTServers(object): @@ -637,183 +615,21 @@ class RESTServers(object):
637 self.__lock.release() 615 self.__lock.release()
638 616
639 ''' 617 '''
640 - id canbe:  
641 - pi: the pi demo, raspberry-pi default demo.  
642 - device_id: the id of device to get.  
643 - action: canbe play or mgmt, play to play the inest stream, mgmt to get api/v1/versions.  
644 - stream: the stream to play, for example, live/livestream for http://server:8080/live/livestream.html  
645 - meeting: the meeting demo. jump to web meeting if index is None.  
646 - device_id: the id of device to get.  
647 - local: whether view the local raspberry-pi stream. if "true", redirect to the local(internal) api server.  
648 - index: the meeting stream index, dynamic get the streams from root.api.v1.chats.get_url_by_index(index)  
649 - gslb: the gslb to get edge ip  
650 - device_id: the id of device to get.  
651 - ingest: deprecated, alias for pi. 618 + get all servers which report to this api-server.
652 ''' 619 '''
653 - def GET(self, id=None, action="play", stream="live/livestream", index=None, local="false", device_id=None): 620 + def GET(self):
654 enable_crossdomain() 621 enable_crossdomain()
655 622
656 try: 623 try:
657 self.__lock.acquire() 624 self.__lock.acquire()
658 625
659 self.__refresh_nodes() 626 self.__refresh_nodes()
660 - data = self.__json_dump_nodes(self.__nodes)  
661 627
662 - server_ip = "demo.chnvideo.com"  
663 - ip = cherrypy.request.remote.ip  
664 - if type is not None:  
665 - peers = self.__get_peers_for_play(device_id)  
666 - if len(peers) > 0:  
667 - server_ip = self.__select_peer(peers, device_id) 628 + data = []
  629 + for node in self.__nodes:
  630 + data.append(node.json_dump())
668 631
669 - # demo, srs meeting urls.  
670 - if id == "meeting":  
671 - if index is None:  
672 - url = "http://%s:8085"%(server_ip)  
673 - elif local == "true":  
674 - url = "http://%s:8085/api/v1/servers?id=%s&index=%s&local=false"%(server_ip, id, index)  
675 - else:  
676 - rtmp_url = root.api.v1.chats.get_url_by_index(index)  
677 - if rtmp_url is None:  
678 - return "meeting stream not found"  
679 - urls = rtmp_url.replace("...vhost...", "?vhost=").replace("rtmp://", "").split("/")  
680 - hls_url = "http://%s:8080/%s/%s.m3u8"%(urls[0].strip(":19350").strip(":1935"), urls[1].split("?")[0], urls[2])  
681 - return self.__generate_hls(hls_url)  
682 - # raspberry-pi urls.  
683 - elif id == "ingest" or id == "pi":  
684 - if action == "play":  
685 - url = "http://%s:8080/%s.html"%(server_ip, stream)  
686 - elif action == "rtmp":  
687 - url = "../../players/srs_player.html?server=%s&vhost=%s&app=%s&stream=%s&autostart=true"%(server_ip, server_ip, stream.split("/")[0], stream.split("/")[1])  
688 - elif action == "hls":  
689 - hls_url = "http://%s:8080/%s.m3u8"%(server_ip, stream);  
690 - if stream.startswith("http://"):  
691 - hls_url = stream;  
692 - return self.__generate_hls(hls_url.replace(".m3u8.m3u8", ".m3u8"))  
693 - else:  
694 - url = "http://%s:8080/api/v1/versions"%(server_ip)  
695 - elif id == "gslb":  
696 - return json.dumps({"code":Error.success, "data": {  
697 - "edge":server_ip, "client":ip,  
698 - "peers":self.__json_dump_nodes(peers),  
699 - "streams": {  
700 - "pi": {  
701 - "livestream": {  
702 - "sales-pi-hls": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/livestream",  
703 - "dev-pi-hls": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/livestream"  
704 - },  
705 - "cztv": {  
706 - "sales-pi-hls": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/rtmp_cztv01-sd",  
707 - "dev-pi-hls": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/rtmp_cztv01-sd"  
708 - }  
709 - },  
710 - "hiwifi": {  
711 - "hls": {  
712 - "dev-livestream": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-hiwifi&stream=live/livestream",  
713 - "sales-livestream": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/livestream"  
714 - },  
715 - "rtmp":{  
716 - "dev-livestream": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-dev-hiwifi&stream=live/livestream",  
717 - "sales-livestream": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/livestream"  
718 - },  
719 - "meiyi": {  
720 - "rtmp": {  
721 - "avatar": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/avatar",  
722 - "MenInBlack3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/MenInBlack3",  
723 - "skyfall": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/skyfall",  
724 - "SpiderMan": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/SpiderMan",  
725 - "thehobbit": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/thehobbit",  
726 - "thorthedarkworld": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/thorthedarkworld",  
727 - "transformers": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-sales-hiwifi&stream=live/transformers"  
728 - },  
729 - "hls": {  
730 - "avatar": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/avatar",  
731 - "MenInBlack3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/MenInBlack3",  
732 - "skyfall": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/skyfall",  
733 - "SpiderMan": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/SpiderMan",  
734 - "thehobbit": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/thehobbit",  
735 - "thorthedarkworld": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/thorthedarkworld",  
736 - "transformers": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-hiwifi&stream=live/transformers"  
737 - }  
738 - }  
739 - },  
740 - "cubieboard": {  
741 - "meiyi": {  
742 - "rtmp": {  
743 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/livestream",  
744 - "stream1": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream1",  
745 - "stream2": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream2",  
746 - "stream3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream3",  
747 - "stream4": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream4",  
748 - "stream5": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream5",  
749 - "stream6": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream6",  
750 - "stream7": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard&stream=live/stream7"  
751 - },  
752 - "hls": {  
753 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/livestream",  
754 - "stream1": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream1",  
755 - "stream2": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream2",  
756 - "stream3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream3",  
757 - "stream4": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream4",  
758 - "stream5": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream5",  
759 - "stream6": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream6",  
760 - "stream7": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard&stream=live/stream7"  
761 - }  
762 - },  
763 - "meiyi-house": {  
764 - "rtmp": {  
765 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-house&stream=live/livestream"  
766 - },  
767 - "hls": {  
768 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-house&stream=live/livestream"  
769 - }  
770 - },  
771 - "meiyi-bk": {  
772 - "rtmp": {  
773 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/livestream",  
774 - "stream1": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream1",  
775 - "stream2": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream2",  
776 - "stream3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream3",  
777 - "stream4": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream4",  
778 - "stream5": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream5",  
779 - "stream6": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream6",  
780 - "stream7": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream7"  
781 - },  
782 - "hls": {  
783 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/livestream",  
784 - "stream1": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream1",  
785 - "stream2": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream2",  
786 - "stream3": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream3",  
787 - "stream4": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream4",  
788 - "stream5": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream5",  
789 - "stream6": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream6",  
790 - "stream7": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-bk&stream=live/stream7"  
791 - }  
792 - },  
793 - "meiyi-dev1": {  
794 - "rtmp": {  
795 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-dev1&stream=live/livestream"  
796 - },  
797 - "hls": {  
798 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-dev1&stream=live/livestream"  
799 - }  
800 - },  
801 - "meiyi-dev2": {  
802 - "rtmp": {  
803 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=rtmp&device_id=chnvideo-meiyi-cubieboard-dev2&stream=live/livestream"  
804 - },  
805 - "hls": {  
806 - "livesteam": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-meiyi-cubieboard-dev2&stream=live/livestream"  
807 - }  
808 - }  
809 - }  
810 - }  
811 - }})  
812 - # others, default.  
813 - else:  
814 - return json.dumps(data)  
815 - #return "id=%s, action=%s, stream=%s, url=%s, index=%s, local=%s"%(id, action, stream, url, index, local)  
816 - raise cherrypy.HTTPRedirect(url) 632 + return json.dumps(data)
817 finally: 633 finally:
818 self.__lock.release() 634 self.__lock.release()
819 635
@@ -827,248 +643,6 @@ class RESTServers(object): @@ -827,248 +643,6 @@ class RESTServers(object):
827 643
828 def OPTIONS(self, *args, **kwargs): 644 def OPTIONS(self, *args, **kwargs):
829 enable_crossdomain() 645 enable_crossdomain()
830 -  
831 - def __generate_hls(self, hls_url):  
832 - return SrsUtility().hls_html(hls_url)  
833 -  
834 -class SrsUtility:  
835 - def hls_html(self, hls_url):  
836 - return """  
837 -<h1>%s</h1>  
838 -<video width="640" height="360"  
839 - autoplay controls autobuffer  
840 - src="%s"  
841 - type="application/vnd.apple.mpegurl">  
842 -</video>"""%(hls_url, hls_url);  
843 -  
844 -global_cdn_id = os.getpid();  
845 -class CdnNode:  
846 - def __init__(self):  
847 - global global_cdn_id  
848 - global_cdn_id += 1  
849 -  
850 - self.id = str(global_cdn_id)  
851 - self.ip = None  
852 - self.origin = None  
853 - self.os = None  
854 - self.srs_status = None  
855 -  
856 - self.public_ip = cherrypy.request.remote.ip  
857 - self.heartbeat = time.time()  
858 -  
859 - self.clients = 0  
860 -  
861 - def dead(self):  
862 - dead_time_seconds = 10  
863 - if time.time() - self.heartbeat > dead_time_seconds:  
864 - return True  
865 - return False  
866 -  
867 - def json_dump(self):  
868 - data = {}  
869 - data["id"] = self.id  
870 - data["ip"] = self.ip  
871 - data["origin"] = self.origin  
872 - data["os"] = self.os  
873 - data["srs_status"] = self.srs_status  
874 - data["public_ip"] = self.public_ip  
875 - data["heartbeat"] = self.heartbeat  
876 - data["heartbeat_h"] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.heartbeat))  
877 - data["clients"] = self.clients  
878 - data["summaries"] = "http://%s:1985/api/v1/summaries"%(self.ip)  
879 - return data  
880 -  
881 -'''  
882 -the cdn nodes list  
883 -'''  
884 -class RESTNodes(object):  
885 - exposed = True  
886 -  
887 - def __init__(self):  
888 - self.__nodes = []  
889 - # @remark, if there is shared data, such as the self.__nodes,  
890 - # we must use lock for cherrypy, or the cpu of cherrypy will high  
891 - # and performance suffer.  
892 - self.__lock = threading.Lock()  
893 -  
894 - def __get_node(self, id):  
895 - for node in self.__nodes:  
896 - if node.id == id:  
897 - return node  
898 - return None  
899 -  
900 - def __refresh_nodes(self):  
901 - while len(self.__nodes) > 0:  
902 - has_dead_node = False  
903 - for node in self.__nodes:  
904 - if node.dead():  
905 - self.__nodes.remove(node)  
906 - has_dead_node = True  
907 - if not has_dead_node:  
908 - break  
909 -  
910 - def __get_peers(self, target_node):  
911 - peers = []  
912 - for node in self.__nodes:  
913 - if str(node.id).strip() == str(target_node.id).strip():  
914 - continue  
915 - if node.public_ip == target_node.public_ip and node.srs_status == "running" and node.origin != target_node.ip:  
916 - peers.append(node)  
917 - return peers  
918 -  
919 - def __get_peers_for_play(self, ip):  
920 - peers = []  
921 - for node in self.__nodes:  
922 - if node.public_ip == ip and node.srs_status == "running":  
923 - peers.append(node)  
924 - return peers  
925 -  
926 - def __json_dump_nodes(self, peers):  
927 - data = []  
928 - for node in peers:  
929 - data.append(node.json_dump())  
930 - return data  
931 -  
932 - def __select_peer(self, peers, ip):  
933 - target = None  
934 - for peer in peers:  
935 - if target is None or target.clients > peer.clients:  
936 - target = peer  
937 - if target is None:  
938 - return None  
939 - target.clients += 1  
940 - return target.ip  
941 -  
942 - def GET(self, type=None, format=None, origin=None, vhost=None, port=None, stream=None, node_id=None):  
943 - enable_crossdomain()  
944 -  
945 - try:  
946 - self.__lock.acquire()  
947 -  
948 - self.__refresh_nodes()  
949 - data = self.__json_dump_nodes(self.__nodes)  
950 -  
951 - ip = cherrypy.request.remote.ip  
952 - if type is not None:  
953 - server = origin  
954 - peers = self.__get_peers_for_play(ip)  
955 - if len(peers) > 0:  
956 - server = self.__select_peer(peers, ip)  
957 - if type == "hls":  
958 - hls_url = "http://%s:%s/%s.m3u8"%(server, port, stream)  
959 - hls_url = hls_url.replace(".m3u8.m3u8", ".m3u8")  
960 - if format == "html":  
961 - return SrsUtility().hls_html(hls_url)  
962 - else:  
963 - #return hls_url  
964 - raise cherrypy.HTTPRedirect(hls_url)  
965 - elif type == "rtmp":  
966 - rtmp_url = "rtmp://%s:%s/%s?vhost=%s/%s"%(server, port, stream.split("/")[0], vhost, stream.split("/")[1])  
967 - if format == "html":  
968 - html = "%s?server=%s&port=%s&vhost=%s&app=%s&stream=%s&autostart=true"%(  
969 - "http://demo.chnvideo.com:8085/srs/trunk/research/players/srs_player.html",  
970 - server, port, vhost, stream.split("/")[0], stream.split("/")[1])  
971 - #return html  
972 - raise cherrypy.HTTPRedirect(html)  
973 - return rtmp_url  
974 - elif type == "gslb":  
975 - return json.dumps({"code":Error.success, "data": {  
976 - "edge":server, "client":ip,  
977 - "peers":self.__json_dump_nodes(peers),  
978 - "streams": {  
979 - "cztv": {  
980 - "hls": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/rtmp_cztv01-sd",  
981 - "rtmp": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=android&port=1935&stream=live/rtmp_cztv01-sd"  
982 - },  
983 - "livestream": {  
984 - "hls": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/livestream",  
985 - "rtmp": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=demo.srs.com&port=1935&stream=live/livestream"  
986 - },  
987 - "apk": "http://demo.chnvideo.com/android.srs.apk"  
988 - }  
989 - }})  
990 -  
991 - return json.dumps({"code":Error.success, "data": data})  
992 - finally:  
993 - self.__lock.release()  
994 -  
995 - def PUT(self):  
996 - enable_crossdomain()  
997 -  
998 - try:  
999 - self.__lock.acquire()  
1000 -  
1001 - req = cherrypy.request.body.read()  
1002 - trace("put to nodes, req=%s"%(req))  
1003 - try:  
1004 - json_req = json.loads(req)  
1005 - except Exception, ex:  
1006 - code = Error.system_parse_json  
1007 - trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code))  
1008 - return json.dumps({"code":code, "data": None})  
1009 -  
1010 - id = str(json_req["id"])  
1011 - node = self.__get_node(id)  
1012 - if node is None:  
1013 - code = Error.cdn_node_not_exists  
1014 - trace("cdn node not exists, req=%s, id=%s, code=%s"%(req, id, code))  
1015 - return json.dumps({"code":code, "data": None})  
1016 -  
1017 - node.heartbeat = time.time()  
1018 - node.srs_status = str(json_req["srs_status"])  
1019 - node.ip = str(json_req["ip"])  
1020 - if "origin" in json_req:  
1021 - node.origin = str(json_req["origin"]);  
1022 - node.public_ip = cherrypy.request.remote.ip  
1023 - # reset if restart.  
1024 - if node.srs_status != "running":  
1025 - node.clients = 0  
1026 -  
1027 - self.__refresh_nodes()  
1028 - peers = self.__get_peers(node)  
1029 - peers_data = self.__json_dump_nodes(peers)  
1030 -  
1031 - res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}})  
1032 - trace(res)  
1033 - return res  
1034 - finally:  
1035 - self.__lock.release()  
1036 -  
1037 - def POST(self):  
1038 - enable_crossdomain()  
1039 -  
1040 - try:  
1041 - self.__lock.acquire()  
1042 -  
1043 - req = cherrypy.request.body.read()  
1044 - trace("post to nodes, req=%s"%(req))  
1045 - try:  
1046 - json_req = json.loads(req)  
1047 - except Exception, ex:  
1048 - code = Error.system_parse_json  
1049 - trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code))  
1050 - return json.dumps({"code":code, "data": None})  
1051 -  
1052 - node = CdnNode()  
1053 - node.ip = str(json_req["ip"]);  
1054 - node.os = str(json_req["os"]);  
1055 - if "origin" in json_req:  
1056 - node.origin = str(json_req["origin"]);  
1057 - node.srs_status = str(json_req["srs_status"])  
1058 - self.__nodes.append(node)  
1059 -  
1060 - self.__refresh_nodes()  
1061 - peers = self.__get_peers(node)  
1062 - peers_data = self.__json_dump_nodes(peers)  
1063 -  
1064 - res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}})  
1065 - trace(res)  
1066 - return res  
1067 - finally:  
1068 - self.__lock.release()  
1069 -  
1070 - def OPTIONS(self, *args, **kwargs):  
1071 - enable_crossdomain()  
1072 646
1073 global_chat_id = os.getpid(); 647 global_chat_id = os.getpid();
1074 ''' 648 '''
@@ -1235,7 +809,6 @@ class V1(object): @@ -1235,7 +809,6 @@ class V1(object):
1235 self.proxy = RESTProxy() 809 self.proxy = RESTProxy()
1236 self.chats = RESTChats() 810 self.chats = RESTChats()
1237 self.servers = RESTServers() 811 self.servers = RESTServers()
1238 - self.nodes = RESTNodes()  
1239 def GET(self): 812 def GET(self):
1240 enable_crossdomain(); 813 enable_crossdomain();
1241 return json.dumps({"code":Error.success, "urls":{ 814 return json.dumps({"code":Error.success, "urls":{
@@ -1244,26 +817,10 @@ class V1(object): @@ -1244,26 +817,10 @@ class V1(object):
1244 "sessions": "for srs http callback, to handle the sessions requests: client play/stop stream", 817 "sessions": "for srs http callback, to handle the sessions requests: client play/stop stream",
1245 "dvrs": "for srs http callback, to handle the dvr requests: dvr stream.", 818 "dvrs": "for srs http callback, to handle the dvr requests: dvr stream.",
1246 "chats": "for srs demo meeting, the chat streams, public chat room.", 819 "chats": "for srs demo meeting, the chat streams, public chat room.",
1247 - "nodes": {  
1248 - "summary": "for srs cdn node",  
1249 - "POST ip=node_ip&os=node_os": "register a new node",  
1250 - "GET": "get the active edge nodes",  
1251 - "GET type=gslb&origin=demo.chnvideo.com": "get the gslb edge ip",  
1252 - "GET type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/livestream": "get the play url, html for hls",  
1253 - "GET type=rtmp&format=html&origin=demo.chnvideo.com&vhost=demo.srs.com&port=1935&stream=live/livestream": "get the play url, for rtmp"  
1254 - },  
1255 "servers": { 820 "servers": {
1256 "summary": "for srs raspberry-pi and meeting demo", 821 "summary": "for srs raspberry-pi and meeting demo",
1257 "GET": "get the current raspberry-pi servers info", 822 "GET": "get the current raspberry-pi servers info",
1258 - "GET id=gslb&device_id=chnvideo-sales-arm": "get the gslb edge ip",  
1259 - "POST ip=node_ip&device_id=device_id": "the new raspberry-pi server info.",  
1260 - "GET id=ingest&action=play&stream=live/livestream": "play the ingest HLS stream on raspberry-pi",  
1261 - "GET id=ingest&action=rtmp&stream=live/livestream": "play the ingest RTMP stream on raspberry-pi",  
1262 - "GET id=ingest&action=hls&stream=live/livestream": "play the ingest HLS stream on raspberry-pi",  
1263 - "GET id=ingest&action=mgmt": "open the HTTP api url of raspberry-pi",  
1264 - "GET id=meeting": "redirect to local raspberry-pi meeting url(local ignored)",  
1265 - "GET id=meeting&local=false&index=0": "play the first(index=0) meeting HLS stream on demo.chnvideo.com(not local)",  
1266 - "GET id=meeting&local=true&index=0": "play the first(index=0) meeting HLS stream on local server(local x86/x64 server), warn: raspberry-pi donot support HLS meeting." 823 + "POST ip=node_ip&device_id=device_id": "the new raspberry-pi server info."
1267 } 824 }
1268 }}); 825 }});
1269 def OPTIONS(self, *args, **kwargs): 826 def OPTIONS(self, *args, **kwargs):