示例#1
0
    def read_config(self):
        """
        This is to load variables from configuration file
        """
        config = ConfigParser.RawConfigParser()
        configurations = config_manager()  # Class from mkchromecast.config
        configf = configurations.configf

        if os.path.exists(configf):
            print(colors.warning('Configuration file exists'))
            print(colors.warning('Using defaults set there'))
            config.read(configf)
            self.notifications = ConfigSectionMap('settings')['notifications']
            self.searchatlaunch = ConfigSectionMap(
                'settings')['searchatlaunch']
            self.colors = ConfigSectionMap('settings')['colors']
        else:
            self.notifications = 'disabled'
            self.searchatlaunch = 'disabled'
            self.colors = 'black'
            if debug == True:
                print(':::systray::: self.notifications ' + self.notifications)
                print(':::systray::: self.searchatlaunch ' +
                      self.searchatlaunch)
                print(':::systray::: self.colors ' + self.colors)
示例#2
0
    def read_config(self):
        """
        This is to load variables from configuration file
        """
        config = ConfigParser.RawConfigParser()
        configurations = config_manager()  # Class from mkchromecast.config
        configf = configurations.configf

        if os.path.exists(configf):
            print(colors.warning("Configuration file exists"))
            print(colors.warning("Using defaults set there"))
            config.read(configf)
            self.notifications = ConfigSectionMap("settings")["notifications"]
            self.searchatlaunch = ConfigSectionMap(
                "settings")["searchatlaunch"]
            self.colors = ConfigSectionMap("settings")["colors"]
        else:
            self.notifications = "disabled"
            self.searchatlaunch = "disabled"
            self.colors = "black"
            if debug is True:
                print(":::systray::: self.notifications " + self.notifications)
                print(":::systray::: self.searchatlaunch " +
                      self.searchatlaunch)
                print(":::systray::: self.colors " + self.colors)
示例#3
0
    def chk_config(self):
        from mkchromecast.preferences import ConfigSectionMap

        self.config.read(self.configf)

        """
        We check that configuration file is complete, otherwise the settings
        are filled from self.defaultconf dictionary.
        """
        chkconfig = [
            "backend",
            "codec",
            "bitrate",
            "samplerate",
            "notifications",
            "colors",
            "searchatlaunch",
            "alsadevice",
        ]
        for e in chkconfig:
            try:
                e = ConfigSectionMap("settings")[str(e)]
            except KeyError:
                if debug is True:
                    print(
                        ":::config::: the setting %s is not correctly set. "
                        "Defaults added." % e
                    )
                self.config.set("settings", str(e), self.defaultconf[e])
                with open(self.configf, "w") as configfile:
                    self.config.write(configfile)

        backend = ConfigSectionMap("settings")["backend"]
        codec = ConfigSectionMap("settings")["codec"]
        bitrate = ConfigSectionMap("settings")["bitrate"]
        samplerate = ConfigSectionMap("settings")["samplerate"]
        notifications = ConfigSectionMap("settings")["notifications"]
        colors = ConfigSectionMap("settings")["colors"]
        searchatlaunch = ConfigSectionMap("settings")["searchatlaunch"]
        alsadevice = ConfigSectionMap("settings")["alsadevice"]

        codecs = ["mp3", "ogg", "aac", "opus", "flac"]

        if os.path.exists(self.configf):
            """
            Reading the codec from config file
            """
            if codec in codecs and bitrate == "None":
                self.config.set("settings", "backend", str(backend))
                self.config.set("settings", "codec", str(codec))
                self.config.set("settings", "bitrate", "192")
                self.config.set("settings", "samplerate", str(samplerate))
                self.config.set("settings", "notifications", str(notifications))
                self.config.set("settings", "colors", str(colors))
                self.config.set("settings", "searchatlaunch", str(searchatlaunch))
                self.config.set("settings", "alsadevice", str(alsadevice))

            with open(self.configf, "w") as configfile:
                self.config.write(configfile)
示例#4
0
    def chk_config(self):
        from mkchromecast.preferences import ConfigSectionMap
        self.config.read(self.configf)
        """
        We check that configuration file is complete, otherwise the settings
        are filled from self.defaultconf dictionary.
        """
        chkconfig = [
            'backend', 'codec', 'bitrate', 'samplerate', 'notifications',
            'colors', 'searchatlaunch', 'alsadevice'
        ]
        for e in chkconfig:
            try:
                e = ConfigSectionMap('settings')[str(e)]
            except KeyError:
                if debug is True:
                    print(':::config::: the setting %s is not correctly set. '
                          'Defaults added.' % e)
                self.config.set('settings', str(e), self.defaultconf[e])
                with open(self.configf, 'w') as configfile:
                    self.config.write(configfile)

        backend = ConfigSectionMap('settings')['backend']
        codec = ConfigSectionMap('settings')['codec']
        bitrate = ConfigSectionMap('settings')['bitrate']
        samplerate = ConfigSectionMap('settings')['samplerate']
        notifications = ConfigSectionMap('settings')['notifications']
        colors = ConfigSectionMap('settings')['colors']
        searchatlaunch = ConfigSectionMap('settings')['searchatlaunch']
        alsadevice = ConfigSectionMap('settings')['alsadevice']

        codecs = [
            'mp3',
            'ogg',
            'aac',
            'opus',
            'flac',
        ]

        if os.path.exists(self.configf):
            """
            Reading the codec from config file
            """
            if codec in codecs and bitrate == 'None':
                self.config.set('settings', 'backend', str(backend))
                self.config.set('settings', 'codec', str(codec))
                self.config.set('settings', 'bitrate', '192')
                self.config.set('settings', 'samplerate', str(samplerate))
                self.config.set('settings', 'notifications',
                                str(notifications))
                self.config.set('settings', 'colors', str(colors))
                self.config.set('settings', 'searchatlaunch',
                                str(searchatlaunch))
                self.config.set('settings', 'alsadevice', str(alsadevice))

            with open(self.configf, 'w') as configfile:
                self.config.write(configfile)
示例#5
0
    def _play_cast_(self):
        if os.path.exists(configf):
            print(colors.warning(":::Threading::: Configuration file exists."))
            print(colors.warning(":::Threading::: Using defaults set there."))
            config.read(configf)
            backend = ConfigSectionMap("settings")["backend"]
            print(":::Threading backend::: %s." % backend)
        else:
            backend = mkchromecast.__init__.backend
        global cast
        if backend == "node":
            stream()
        else:
            try:
                reload(mkchromecast.audio)
            except NameError:
                from imp import reload

                reload(mkchromecast.audio)
            mkchromecast.audio.main()
        if platform == "Linux":
            # We create the sink only if it is not available
            if check_sink() is False and adevice is None:
                create_sink()

        start = Casting()
        start.initialize_cast()
        try:
            start.get_devices()
            start.play_cast()
            cast = start.cast
            # Let's change inputs at the end to avoid muting sound too early.
            # For Linux it does not matter given that user has to select sink
            # in pulse audio.  Therefore the sooner it is available, the
            # better.
            if platform == "Darwin":
                inputdev()
                outputdev()
            self.pcastready.emit("_play_cast_ success")
        except AttributeError:
            self.pcastready.emit("_play_cast_ failed")
        self.pcastfinished.emit()
示例#6
0
 def _play_cast_(self):
     if os.path.exists(configf):
         print(colors.warning(':::Threading::: Configuration file exists'))
         print(colors.warning(':::Threading::: Using defaults set there'))
         config.read(configf)
         backend = ConfigSectionMap('settings')['backend']
         print(':::Threading backend::: ' + backend)
     else:
         backend = mkchromecast.__init__.backend
     global cast
     if backend == 'node':
         stream()
     else:
         try:
             reload(mkchromecast.audio)
         except NameError:
             from imp import reload
             reload(mkchromecast.audio)
         mkchromecast.audio.main()
     if platform == 'Linux':
         create_sink()
     start = casting()
     start.initialize_cast()
     try:
         start.get_cc()
         start.play_cast()
         cast = start.cast
         if platform == 'Darwin':  # Let's change inputs at the end to avoid muting sound too early.
             inputdev(
             )  # For Linux it does not matter given that user has to select sink in pulse audio.
             outputdev(
             )  # Therefore the sooner it is available, the better.
         self.pcastready.emit('_play_cast_ success')
     except AttributeError:
         self.pcastready.emit('_play_cast_ failed')
     self.pcastfinished.emit()
示例#7
0
    def play_cast(self):
        if self.debug is True:
            print("def play_cast(self):")
        localip = self.ip

        try:
            print(
                colors.options("The IP of ") + colors.success(self.cast_to) +
                colors.options(" is:") + " " + self.cast.host)
        except TypeError:
            print(
                colors.options("The IP of ") +
                colors.success(self.cast_to.player_name) +
                colors.options(" is:") + " " + self.cast_to.ip_address)
        except AttributeError:
            for _ in self.sonos_list:
                if self.cast_to == _.coordinator.player_name:
                    self.cast_to = _
            print(
                colors.options("The IP of ") +
                colors.success(self.cast_to.coordinator.player_name) +
                colors.options(" is:") + " " +
                self.cast_to.coordinator.ip_address)

        if self.host is None:
            print(colors.options("Your local IP is:") + " " + localip)
        else:
            print(
                colors.options("Your manually entered local IP is:") + " " +
                localip)

        try:
            media_controller = self.cast.media_controller

            if self.tray is True:
                config = ConfigParser.RawConfigParser()
                # Class from mkchromecast.config
                from mkchromecast.config import config_manager

                configurations = config_manager()
                configf = configurations.configf

                if os.path.exists(configf) and self.tray is True:
                    print(self.tray)
                    print(colors.warning("Configuration file exists"))
                    print(colors.warning("Using defaults set there"))
                    config.read(configf)
                    self.backend = ConfigSectionMap("settings")["backend"]

            if self.source_url is not None:
                if args.video is True:
                    import mkchromecast.video

                    mtype = mkchromecast.video.mtype
                else:
                    import mkchromecast.audio

                    mtype = mkchromecast.audio.mtype
                print(" ")
                print(
                    colors.options("Casting from stream URL:") + " " +
                    self.source_url)
                print(colors.options("Using media type:") + " " + mtype)
                media_controller.play_media(self.source_url,
                                            mtype,
                                            title=self.title,
                                            stream_type="LIVE")
                media_controller.play()
            elif (self.backend == "ffmpeg" or self.backend == "node"
                  or self.backend == "avconv" or self.backend == "parec"
                  or self.backend == "gstreamer" and self.source_url is None):
                if args.video is True:
                    import mkchromecast.video

                    mtype = mkchromecast.video.mtype
                else:
                    import mkchromecast.audio

                    mtype = mkchromecast.audio.mtype
                print(" ")
                print(
                    colors.options("The media type string used is:") + " " +
                    mtype)
                media_controller.play_media(
                    "http://" + localip + ":" + self.port + "/stream",
                    mtype,
                    title=self.title,
                    stream_type="LIVE",
                )

            if media_controller.is_active:
                media_controller.play()

            print(" ")
            print(colors.important("Cast media controller status"))
            print(" ")
            print(self.cast.status)
            print(" ")

            time.sleep(5.0)
            media_controller.play()

            if self.hijack is True:
                self.r = Thread(target=self.hijack_cc)
                # This has to be set to True so that we catch
                # KeyboardInterrupt.
                self.r.daemon = True
                self.r.start()

        except AttributeError:
            self.sonos = self.cast_to
            self.sonos.coordinator.play_uri(
                "x-rincon-mp3radio://" + localip + ":" + self.port + "/stream",
                title=self.title,
            )
            if self.tray is True:
                self.cast = self.sonos
示例#8
0
        import urlparse
        url_data = urlparse.urlparse(youtubeurl)
        query = urlparse.parse_qs(url_data.query)
    except ImportError:
        import urllib.parse
        url_data = urllib.parse.urlparse(youtubeurl)
        query = urllib.parse.parse_qs(url_data.query)
    video = query['v'][0]
    print(colors.options('Playing video:') + ' ' + video)
    command = ['youtube-dl', '-o', '-', youtubeurl]
    mtype = 'audio/mp4'
else:
    if os.path.exists(configf) and tray == True:
        configurations.chk_config()
        config.read(configf)
        backend = ConfigSectionMap('settings')['backend']
        backends_dict[backend] = backend
        codec = ConfigSectionMap('settings')['codec']
        bitrate = ConfigSectionMap('settings')['bitrate']
        samplerate = ConfigSectionMap('settings')['samplerate']
        adevice = ConfigSectionMap('settings')['alsadevice']
        if adevice == 'None':
            adevice = None
        if debug == True:
            print(':::audio::: tray =' + str(tray))
            print(colors.warning('Configuration file exists'))
            print(colors.warning('Using defaults set there'))
            print(backend, codec, bitrate, samplerate, adevice)
    else:
        backend = mkchromecast.__init__.backend
        backends_dict[backend] = backend
示例#9
0
    def play_cast(self):
        if self.debug == True:
            print('def play_cast(self):')
        localip = self.ip

        print(colors.options('The IP of ')+colors.success(self.cast_to)+colors.options(' is:')+' '+self.cast.host)
        if self.host == None:
            print(colors.options('Your local IP is:')+' '+localip)
        else:
            print(colors.options('Your manually entered local IP is:')+' '+localip)

        """
        if self.youtubeurl != None:
            print(colors.options('The Youtube URL chosen:')+' '+self.youtubeurl)
            import pychromecast.controllers.youtube as youtube
            yt = youtube.YouTubeController()
            self.cast.register_handler(yt)

            try:
                import urlparse
                url_data = urlparse.urlparse(self.youtubeurl)
                query = urlparse.parse_qs(url_data.query)
            except ImportError:
                import urllib.parse
                url_data = urllib.parse.urlparse(self.youtubeurl)
                query = urllib.parse.parse_qs(url_data.query)
            video = query["v"][0]
            print(colors.options('Playing video:')+' '+video)
            yt.play_video(video)
        else:
        """
        media_controller = self.cast.media_controller

        if self.tray == True:
            config = ConfigParser.RawConfigParser()
            configurations = config_manager()    # Class from mkchromecast.config
            configf = configurations.configf

            if os.path.exists(configf) and self.tray == True:
                print(tray)
                print(colors.warning('Configuration file exists'))
                print(colors.warning('Using defaults set there'))
                config.read(configf)
                self.backend = ConfigSectionMap('settings')['backend']

        if self.sourceurl != None:
            if args.video == True:
                import mkchromecast.video
                mtype = mkchromecast.video.mtype
            else:
                import mkchromecast.audio
                mtype = mkchromecast.audio.mtype
            print(' ')
            print(colors.options('Casting from stream URL:')+' '+self.sourceurl)
            print(colors.options('Using media type:')+' '+mtype)
            media_controller.play_media(self.sourceurl, mtype, title = self.title)
        elif (self.backend == 'ffmpeg' or self.backend == 'node' or self.backend == 'avconv' or
                self.backend == 'parec' or self.backend == 'gstreamer' and self.sourceurl == None):
            if args.video == True:
                import mkchromecast.video
                mtype = mkchromecast.video.mtype
            else:
                import mkchromecast.audio
                mtype = mkchromecast.audio.mtype
            print(' ')
            print(colors.options('The media type string used is:')+' '+mtype)
            media_controller.play_media('http://'+localip+':5000/stream', mtype, title = self.title)
        print(' ')
        print(colors.important('Cast media controller status'))
        print(' ')
        print(self.cast.status)
        print(' ')
        if self.reconnect == True:
            self.r = Thread(target = self.reconnect_cc)
            self.r.daemon = True   # This has to be set to True so that we catch KeyboardInterrupt.
            self.r.start()
示例#10
0
    def play_cast(self):
        if self.debug is True:
            print('def play_cast(self):')
        localip = self.ip

        try:
            print(
                colors.options('The IP of ') + colors.success(self.cast_to) +
                colors.options(' is:') + ' ' + self.cast.host)
        except TypeError:
            print(
                colors.options('The IP of ') +
                colors.success(self.cast_to.player_name) +
                colors.options(' is:') + ' ' + self.cast_to.ip_address)
        except AttributeError:
            for _ in self.sonos_list:
                if self.cast_to in _.player_name:
                    self.cast_to = _
            print(
                colors.options('The IP of ') +
                colors.success(self.cast_to.player_name) +
                colors.options(' is:') + ' ' + self.cast_to.ip_address)

        if self.host is None:
            print(colors.options('Your local IP is:') + ' ' + localip)
        else:
            print(
                colors.options('Your manually entered local IP is:') + ' ' +
                localip)

        try:
            media_controller = self.cast.media_controller

            if self.tray is True:
                config = ConfigParser.RawConfigParser()
                # Class from mkchromecast.config
                from mkchromecast.config import config_manager
                configurations = config_manager()
                configf = configurations.configf

                if os.path.exists(configf) and self.tray is True:
                    print(self.tray)
                    print(colors.warning('Configuration file exists'))
                    print(colors.warning('Using defaults set there'))
                    config.read(configf)
                    self.backend = ConfigSectionMap('settings')['backend']

            if self.sourceurl is not None:
                if args.video is True:
                    import mkchromecast.video
                    mtype = mkchromecast.video.mtype
                else:
                    import mkchromecast.audio
                    mtype = mkchromecast.audio.mtype
                print(' ')
                print(
                    colors.options('Casting from stream URL:') + ' ' +
                    self.sourceurl)
                print(colors.options('Using media type:') + ' ' + mtype)
                media_controller.play_media(self.sourceurl,
                                            mtype,
                                            title=self.title)
            elif (self.backend == 'ffmpeg' or self.backend == 'node'
                  or self.backend == 'avconv' or self.backend == 'parec'
                  or self.backend == 'gstreamer' and self.sourceurl is None):
                if args.video is True:
                    import mkchromecast.video
                    mtype = mkchromecast.video.mtype
                else:
                    import mkchromecast.audio
                    mtype = mkchromecast.audio.mtype
                print(' ')
                print(
                    colors.options('The media type string used is:') + ' ' +
                    mtype)
                media_controller.play_media('http://' + localip + ':' +
                                            self.port + '/stream',
                                            mtype,
                                            title=self.title)
            print(' ')
            print(colors.important('Cast media controller status'))
            print(' ')
            print(self.cast.status)
            print(' ')
            if self.hijack is True:
                self.r = Thread(target=self.hijack_cc)
                # This has to be set to True so that we catch
                # KeyboardInterrupt.
                self.r.daemon = True
                self.r.start()
        except AttributeError:
            self.sonos = self.cast_to
            self.sonos.play_uri('x-rincon-mp3radio://' + localip + ':' +
                                self.port + '/stream',
                                title=self.title)
            if self.tray is True:
                self.cast = self.sonos
示例#11
0
def streaming():
    """
    Configuration files
    """
    platform = mkchromecast.__init__.platform
    tray = mkchromecast.__init__.tray
    debug = mkchromecast.__init__.debug
    config = ConfigParser.RawConfigParser()
    configurations = config_manager()  # Class from mkchromecast.config
    configf = configurations.configf

    if os.path.exists(configf) and tray == True:
        configurations.chk_config()
        print(colors.warning('Configuration file exists'))
        print(colors.warning('Using defaults set there'))
        config.read(configf)
        backend = ConfigSectionMap('settings')['backend']
        rcodec = ConfigSectionMap('settings')['codec']
        bitrate = ConfigSectionMap('settings')['bitrate']
        samplerate = ConfigSectionMap('settings')['samplerate']
        notifications = ConfigSectionMap('settings')['notifications']
    else:
        backend = mkchromecast.__init__.backend
        rcodec = mkchromecast.__init__.rcodec
        codec = mkchromecast.__init__.codec
        bitrate = str(mkchromecast.__init__.bitrate)
        samplerate = str(mkchromecast.__init__.samplerate)
        notifications = mkchromecast.__init__.notifications

    print(colors.options('Selected backend:') + ' ' + backend)

    if debug == True:
        print(':::node::: variables', backend, rcodec, bitrate, samplerate,
              notifications)

    try:
        youtubeurl = mkchromecast.__init__.youtubeurl
    except AttributeError:
        youtubeurl = None

    if youtubeurl == None:
        if backend == 'node' and rcodec != 'mp3':
            print(
                colors.warning('Codec ' + rcodec +
                               ' is not supported by the node server!'))
            print('Using ' + codec + ' as default.')

        if backend == 'node':
            if int(bitrate) == 192:
                print(
                    colors.options('Default bitrate used:') + ' ' + bitrate +
                    'k')
            elif int(bitrate) > 320:
                print(
                    colors.warning('Maximum bitrate supported by ' + codec +
                                   ' is:') + ' ' + str(320) + 'k')
                bitrate = '320'
                print(colors.warning('Bitrate has been set to maximum!'))
            else:
                print(colors.options('Selected bitrate: ') + bitrate + 'k')

            if samplerate == '44100':
                print(
                    colors.options('Default sample rate used:') + ' ' +
                    samplerate + 'Hz')
            else:
                codecs_sr = ['mp3', 'ogg', 'aac', 'wav', 'flac']
                '''
                The codecs below do not support 96000Hz
                '''
                no96k = ['mp3', 'ogg']

                if codec in codecs_sr and int(samplerate) > 22000 and int(
                        samplerate) <= 27050:
                    samplerate = '22050'
                    msg.samplerate_no96(codec)

                if codec in codecs_sr and int(samplerate) > 27050 and int(
                        samplerate) <= 32000:
                    samplerate = '32000'
                    msg.samplerate_no96(codec)

                elif codec in codecs_sr and int(samplerate) > 32000 and int(
                        samplerate) <= 36000:
                    samplerate = '32000'
                    msg.samplerate_no96(codec)

                elif codec in codecs_sr and int(samplerate) > 36000 and int(
                        samplerate) <= 43000:
                    samplerate = '44100'
                    msg.samplerate_no96(codec)
                    print(
                        colors.warning('Sample rate has been set to default!'))

                elif codec in codecs_sr and int(samplerate) > 43000 and int(
                        samplerate) <= 72000:
                    samplerate = '48000'
                    msg.samplerate_no96(codec)

                elif codec in codecs_sr and int(samplerate) > 72000:
                    if codec in no96k:
                        msg.samplerate_no96(codec)
                        samplerate = '48000'
                    print(
                        colors.warning('Sample rate has been set to maximum!'))

                print(
                    colors.options('Sample rate set to:') + ' ' + samplerate +
                    'Hz')
    """
    Node section
    """
    if os.path.exists('./bin/node') == True:
        webcast = [
            './bin/node',
            './nodejs/node_modules/webcast-osx-audio/bin/webcast.js', '-b',
            bitrate, '-s', samplerate, '-p', '5000', '-u', 'stream'
        ]
    else:
        webcast = [
            './nodejs/bin/node',
            './nodejs/node_modules/webcast-osx-audio/bin/webcast.js', '-b',
            bitrate, '-s', samplerate, '-p', '5000', '-u', 'stream'
        ]
    p = subprocess.Popen(webcast)
    if debug == True:
        print(':::node::: node command', webcast)

    f = open('/tmp/mkchromecast.pid', 'rb')
    pidnumber = int(pickle.load(f))
    print(colors.options('PID of main process:') + ' ' + str(pidnumber))

    localpid = getpid()
    print(colors.options('PID of streaming process:') + ' ' + str(localpid))

    while p.poll() is None:
        try:
            time.sleep(0.5)
            if psutil.pid_exists(
                    pidnumber
            ) == False:  # With this I ensure that if the main app fails, everything
                inputint()  # will get back to normal
                outputint()
                parent = psutil.Process(localpid)
                for child in parent.children(
                        recursive=True
                ):  # or parent.children() for recursive=False
                    child.kill()
                parent.kill()
        except KeyboardInterrupt:
            print('Ctrl-c was requested')
            sys.exit(0)
        except IOError:
            print('I/O Error')
            sys.exit(0)
        except OSError:
            print('OSError')
            sys.exit(0)
    else:
        print(colors.warning('Reconnecting node streaming...'))
        if platform == 'Darwin' and notifications == 'enabled':
            if os.path.exists('images/google.icns') == True:
                noticon = 'images/google.icns'
            else:
                noticon = 'google.icns'
        if debug == True:
            print(':::node::: platform, tray, notifications', platform, tray,
                  notifications)

        if platform == 'Darwin' and tray == True and notifications == 'enabled':
            reconnecting = [
                './notifier/terminal-notifier.app/Contents/MacOS/terminal-notifier',
                '-group', 'cast', '-contentImage', noticon, '-title',
                'mkchromecast', '-subtitle', 'node server failed', '-message',
                'Reconnecting...'
            ]
            subprocess.Popen(reconnecting)

            if debug == True:
                print(':::node::: reconnecting notifier command', reconnecting)
        relaunch(stream, recasting, kill)
    return
示例#12
0
        url_data = urlparse.urlparse(youtube_url)
        query = urlparse.parse_qs(url_data.query)
    except ImportError:
        import urllib.parse

        url_data = urllib.parse.urlparse(youtube_url)
        query = urllib.parse.parse_qs(url_data.query)
    video = query["v"][0]
    print(colors.options("Playing video:") + " " + video)
    command = ["youtube-dl", "-o", "-", youtube_url]
    mtype = "audio/mp4"
else:
    if os.path.exists(configf) and tray is True:
        configurations.chk_config()
        config.read(configf)
        backend = ConfigSectionMap("settings")["backend"]
        backends_dict[backend] = backend
        codec = ConfigSectionMap("settings")["codec"]
        bitrate = ConfigSectionMap("settings")["bitrate"]
        samplerate = ConfigSectionMap("settings")["samplerate"]
        adevice = ConfigSectionMap("settings")["alsadevice"]
        if adevice == "None":
            adevice = None
        if debug is True:
            print(":::audio::: tray = " + str(tray))
            print(colors.warning("Configuration file exists"))
            print(colors.warning("Using defaults set there"))
            print(backend, codec, bitrate, samplerate, adevice)
    else:
        backend = mkchromecast.__init__.backend
        backends_dict[backend] = backend
示例#13
0
def streaming():
    """
    Configuration files
    """
    platform = mkchromecast.__init__.platform
    tray = mkchromecast.__init__.tray
    debug = mkchromecast.__init__.debug
    config = ConfigParser.RawConfigParser()
    # Class from mkchromecast.config
    configurations = config_manager()
    configf = configurations.configf

    if os.path.exists(configf) and tray is True:
        configurations.chk_config()
        print(colors.warning("Configuration file exists"))
        print(colors.warning("Using defaults set there"))
        config.read(configf)
        backend = ConfigSectionMap("settings")["backend"]
        rcodec = ConfigSectionMap("settings")["codec"]
        bitrate = ConfigSectionMap("settings")["bitrate"]
        samplerate = ConfigSectionMap("settings")["samplerate"]
        notifications = ConfigSectionMap("settings")["notifications"]
    else:
        backend = mkchromecast.__init__.backend
        rcodec = mkchromecast.__init__.rcodec
        codec = mkchromecast.__init__.codec
        bitrate = str(mkchromecast.__init__.bitrate)
        samplerate = str(mkchromecast.__init__.samplerate)
        notifications = mkchromecast.__init__.notifications

    print(colors.options("Selected backend:") + " " + backend)

    if debug is True:
        print(
            ":::node::: variables %s, %s, %s, %s, %s"
            % (backend, rcodec, bitrate, samplerate, notifications)
        )

    try:
        youtube_url = mkchromecast.__init__.youtube_url
    except AttributeError:
        youtube_url = None

    if youtube_url is None:
        if backend == "node" and rcodec != "mp3":
            print(
                colors.warning(
                    "Codec " + rcodec + " is not supported by the node server!"
                )
            )
            print("Using " + codec + " as default.")

        if backend == "node":
            if int(bitrate) == 192:
                print(colors.options("Default bitrate used:") + " " + bitrate + "k.")
            elif int(bitrate) > 500:
                print(
                    colors.warning("Maximum bitrate supported by " + codec + " is:")
                    + " "
                    + str(500)
                    + "k."
                )
                bitrate = "500"
                print(colors.warning("Bitrate has been set to maximum!"))
            else:
                print(colors.options("Selected bitrate: ") + bitrate + "k.")

            if samplerate == "44100":
                print(
                    colors.options("Default sample rate used:")
                    + " "
                    + samplerate
                    + "Hz."
                )
            else:
                codecs_sr = ["mp3", "ogg", "aac", "wav", "flac"]

                """
                The codecs below do not support 96000Hz
                """
                no96k = ["mp3", "ogg"]

                if (
                    codec in codecs_sr
                    and int(samplerate) > 22000
                    and int(samplerate) <= 27050
                ):
                    samplerate = "22050"
                    msg.samplerate_no96(codec)

                if (
                    codec in codecs_sr
                    and int(samplerate) > 27050
                    and int(samplerate) <= 32000
                ):
                    samplerate = "32000"
                    msg.samplerate_no96(codec)

                elif (
                    codec in codecs_sr
                    and int(samplerate) > 32000
                    and int(samplerate) <= 36000
                ):
                    samplerate = "32000"
                    msg.samplerate_no96(codec)

                elif (
                    codec in codecs_sr
                    and int(samplerate) > 36000
                    and int(samplerate) <= 43000
                ):
                    samplerate = "44100"
                    msg.samplerate_no96(codec)
                    print(
                        colors.warning(
                            "Sample rate has been set to \
                        default!"
                        )
                    )

                elif (
                    codec in codecs_sr
                    and int(samplerate) > 43000
                    and int(samplerate) <= 72000
                ):
                    samplerate = "48000"
                    msg.samplerate_no96(codec)

                elif codec in codecs_sr and int(samplerate) > 72000:
                    if codec in no96k:
                        msg.samplerate_no96(codec)
                        samplerate = "48000"
                    print(
                        colors.warning(
                            "Sample rate has been set to \
                        maximum!"
                        )
                    )

                print(colors.options("Sample rate set to:") + " " + samplerate + "Hz.")

    """
    Node section
    """
    paths = ["/usr/local/bin/node", "./bin/node", "./nodejs/bin/node"]

    for path in paths:
        if os.path.exists(path) is True:
            webcast = [
                path,
                "./nodejs/node_modules/webcast-osx-audio/bin/webcast.js",
                "-b",
                bitrate,
                "-s",
                samplerate,
                "-p",
                "5000",
                "-u",
                "stream",
            ]
            break
    else:
        webcast = None
        print(colors.warning("Node is not installed..."))
        print(
            colors.warning("Use your package manager or their official " "installer...")
        )
        pass

    if webcast is not None:
        p = subprocess.Popen(webcast)

        if debug is True:
            print(":::node::: node command: %s." % webcast)

        f = open("/tmp/mkchromecast.pid", "rb")
        pidnumber = int(pickle.load(f))
        print(colors.options("PID of main process:") + " " + str(pidnumber))

        localpid = getpid()
        print(colors.options("PID of streaming process: ") + str(localpid))

        while p.poll() is None:
            try:
                time.sleep(0.5)
                # With this I ensure that if the main app fails, everything
                # will get back to normal
                if psutil.pid_exists(pidnumber) is False:
                    inputint()
                    outputint()
                    parent = psutil.Process(localpid)
                    # or parent.children() for recursive=False
                    for child in parent.children(recursive=True):
                        child.kill()
                    parent.kill()
            except KeyboardInterrupt:
                print("Ctrl-c was requested")
                sys.exit(0)
            except IOError:
                print("I/O Error")
                sys.exit(0)
            except OSError:
                print("OSError")
                sys.exit(0)
        else:
            print(colors.warning("Reconnecting node streaming..."))
            if platform == "Darwin" and notifications == "enabled":
                if os.path.exists("images/google.icns") is True:
                    noticon = "images/google.icns"
                else:
                    noticon = "google.icns"
            if debug is True:
                print(
                    ":::node::: platform, tray, notifications: %s, %s, %s."
                    % (platform, tray, notifications)
                )

            if platform == "Darwin" and tray is True and notifications == "enabled":
                reconnecting = [
                    "./notifier/terminal-notifier.app/Contents/MacOS/terminal-notifier",
                    "-group",
                    "cast",
                    "-contentImage",
                    noticon,
                    "-title",
                    "mkchromecast",
                    "-subtitle",
                    "node server failed",
                    "-message",
                    "Reconnecting...",
                ]
                subprocess.Popen(reconnecting)

                if debug is True:
                    print(
                        ":::node::: reconnecting notifier command: %s." % reconnecting
                    )
            relaunch(stream, recasting, kill)
        return