Example #1
0
 def cmd_current(self, q):
     queue = yield self.queue_cmd("queue",
                                  {"parameters": self.pretty_params})
     if len(queue) == 0:
         raise service.Return("(Nothing)")
     result = self.pretty(queue[0])
     raise service.Return(result)
Example #2
0
 def set_state(self, name, relay, new_state):
     name = name.upper()
     if name in self.devices:
         self.devices[name].set(relay, state=new_state)
         self.devices[name].flush()
         raise service.Return(True)
     raise service.Return(False)
Example #3
0
 def cmd_queue(self, q):
     queue = yield self.queue_cmd("queue",
                                  {"parameters": self.pretty_params})
     if len(queue) == 0:
         raise service.Return("Queue is empty.")
     result = '\n'.join([
         u"{0}. {1}".format(n + 1, self.pretty(mod))
         for (n, mod) in enumerate(queue)
     ])
     raise service.Return(result)
Example #4
0
 def vol_cmd(self, cmd, args={}, assert_success=True):
     try:
         result = yield service.json_query(self.vol_host, self.vol_port, {
             "cmd": cmd,
             "args": args
         })
     except (socket.error, service.TimeoutError):
         raise Exception("Error communicating with volume control.")
     if assert_success:
         raise service.Return(packet.assert_success(result))
     raise service.Return(result)
Example #5
0
    def do(self, message):
        message = message.strip()
        for (regex, func) in self.nlp_commands:
            m = re.match(regex, message, re.I)
            if m:
                result = yield func(self, message, *m.groups())
                raise service.Return(result)
        raise Exception("Command not recognized.")

        #result = yield self.queue_cmd("queue")
        raise service.Return({'message': 'Did ' + message})
Example #6
0
    def youtube_search(self, q):
        if q in self.youtube_cache:
            print "cache hit"
            raise service.Return(self.youtube_cache[q])
        print "cache miss"

        http_client = tornado.httpclient.AsyncHTTPClient()
        # Return the args dict for the first youtube result for 'match'
        youtube_search_url = "https://www.googleapis.com/youtube/v3/search"
        search_data = {
            "part": "snippet",
            "key": self.youtube_api_key,
            "order": "relevance",
            "safesearch": "none",
            "type": "video",
            "max-results": 5,
            "q": q,
        }
        search_form_data = urllib.urlencode(search_data)

        search_results = yield http_client.fetch(youtube_search_url + "?" +
                                                 search_form_data)
        search_json = json.loads(search_results.body)

        video_ids = [v["id"]["videoId"] for v in search_json["items"]]

        youtube_video_url = "https://www.googleapis.com/youtube/v3/videos"
        video_data = {
            "part": "contentDetails,snippet,statistics",
            "key": self.youtube_api_key,
            "id": ",".join(video_ids),
        }
        video_form_data = urllib.urlencode(video_data)
        video_results = yield http_client.fetch(youtube_video_url + "?" +
                                                video_form_data)
        video_json = json.loads(video_results.body)

        output = []
        for yi in video_json['items']:
            sr = {
                "video_id": yi["id"],
                "url": "http://www.youtube.com/watch?v={0}".format(yi["id"]),
                "title": yi["snippet"]["title"],
                "thumbnail": yi["snippet"]["thumbnails"]["default"]["url"],
                "publish_time": yi["snippet"]["publishedAt"],
                "views": yi["statistics"]["viewCount"],
                "duration":
                self.parse_duration(yi["contentDetails"]["duration"]),
            }
            output.append(sr)

        self.youtube_cache[q] = output
        raise service.Return(output)
Example #7
0
    def cmd_bug(self, q, text):
        bug_url = "https://api.github.com/repos/zbanks/musicazoo/issues"
        suffix = "\n\nSubmitted via NLP service."
        bug_data = json.dumps({'title': text, 'body': text + suffix})
        password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
        try:
            password_mgr.add_password(None, bug_url, settings.github_login[0],
                                      settings.github_login[1])
        except AttributeError:
            raise service.Return(
                u"No github account configured in settings.json")

        handler = urllib2.HTTPBasicAuthHandler(password_mgr)
        #TODO request(bug_url, bug_data, auth=(musicazoo-bugs, musicaz00)
        raise service.Return(u'Submitted bug: %s - thanks!')
Example #8
0
 def cmd_rm_bot(self, q):
     queue = yield self.queue_cmd("queue",
                                  {"parameters": self.pretty_params})
     if len(queue) == 0:
         raise Exception("Queue is empty!")
     mod = queue[-1]
     yield self.queue_cmd("rm", {"uids": [mod['uid']]})
     raise service.Return(u"Removed {0}".format(self.pretty(mod)))
Example #9
0
 def get_vol(self):
     if alsaaudio:
         v = self.mixer.getvolume()[0]
     elif osax:
         v = self.mixer.get_volume_settings()[osax.k.output_volume]
     else:
         v = 0
     raise service.Return({'vol': computer_to_human(v)})
Example #10
0
 def wildcard_suggest(self, text):
     text = text.strip()
     results = []
     if text.startswith("http:"):
         rs = yield self.url_suggest(text)
         results.extend(rs)
     yr = yield self.youtube_suggest(text)
     results.extend(yr)
     raise service.Return(results)
Example #11
0
 def url_suggest(self, url):
     #TODO
     results = [{
         "title": url,
         "action": url,
         "help": "",
         "match": len(url)
     }]
     yield service.Return(results)
Example #12
0
 def set_vol(self, vol):
     v = human_to_computer(vol)
     if alsaaudio:
         self.mixer.setvolume(v)
     elif osax:
         self.mixer.set_volume(output_volume=v)
     else:
         print "Setting fake volume: ", v
     raise service.Return({})
Example #13
0
 def cmd_swear(self, q):
     # Swear words according to yahoo chat.
     # See: http://ridiculousfish.com/blog/posts/YahooChatRooms.html
     words = "ahole,aholes,asshole,assholes,asswipe,biatch,bitch,bitches,blo_job,blow_job,b*****b,c********r,c**t,cunts,dickhead,f**k,f****d,f*****g,fuckoff,f***s,handjob,handjobs,m**********r,mother-f****r,motherfuckers,muthafucker,muthafuckers,n***a,niggs,nigger,niggers,pedofile,pedophile,phag,phuc,phuck,phucked,phucker,shat,shit,shits,s******d,shitter,s******g".split(
         ",")
     selection = random.sample(words, 5)
     text = " ".join(selection)
     yield self.queue_cmd("add", {"type": "text", "args": {"text": text}})
     raise service.Return(u'Queued swearing.')
Example #14
0
    def cmd_yt(self, q, kw):
        result = yield self.youtube_search(kw)

        if not result or not result[0]:
            raise Exception('No Youtube results found.')

        url = result[0]["url"]
        title = result[0]["title"]

        yield self.queue_cmd("add", {"type": "youtube", "args": {"url": url}})

        raise service.Return(u'Queued "{0}"'.format(title))
Example #15
0
    def cmd_list(self, offset=0, count=100):
        count = max(min(self.MAX_COUNT, count), 1)

        rows = self.db.execute_select("""SELECT
                    COUNT(mle_qa.pk) AS addcount,
                    COUNT(mle_mp.pk) AS playcount,
                    top_item_module.item_pk,
                    top_item.requeue_command AS requeue_command,
                    top_item.url AS url,
                    top_item.description AS description
                FROM top_item_module
                INNER JOIN top_item 
                    ON top_item.pk = top_item_module.item_pk
                LEFT JOIN top_module AS mod_qa 
                    ON top_item_module.module_uuid = mod_qa.uuid
                LEFT JOIN top_module AS mod_mp 
                    ON top_item_module.module_uuid = mod_mp.uuid
                LEFT JOIN top_module_log_entry AS mle_qa
                    ON mod_qa.uuid = mle_qa.module_uuid
                LEFT JOIN top_module_log_entry AS mle_mp
                    ON mod_mp.uuid = mle_mp.module_uuid
                WHERE (mle_qa.log_type = "queue_add" OR mle_qa.log_type IS NULL)
                  AND (mle_mp.log_type = "module_play" OR mle_mp.log_type IS NULL)
                GROUP BY top_item_module.item_pk
                ORDER BY addcount DESC
                LIMIT :offset, :count
            """,
                                      offset=offset,
                                      count=count)

        last_rank = offset + 1
        last_plays = None
        results = []

        for i, row in enumerate(rows):
            print row
            if row["addcount"] == last_plays:
                rank = last_rank
            else:
                rank = offset + 1 + i
                last_rank = rank
                last_plays = row["addcount"]
            results.append({
                'url': row['url'],
                'description': row['description'],
                'command': row['requeue_command'],
                'queue_count': row['addcount'],
                'play_count': row['playcount'],
                'rank': rank,
            })

        raise service.Return(results)
Example #16
0
 def cmd_bump(self, q):
     queue = yield self.queue_cmd("queue",
                                  {"parameters": self.pretty_params})
     if len(queue) == 0:
         raise Exception("Queue is empty!")
     if len(queue) == 1:
         raise Exception("Only one thing on the queue!")
     old_uids = [mod['uid'] for mod in queue]
     mod_bot = queue[-1]
     new_uids = old_uids[-1:] + old_uids[0:-1]
     yield self.queue_cmd("mv", {"uids": [mod['uid']]})
     raise service.Return(u"Bumped {0} to the top".format(
         self.pretty(mod_bot)))
Example #17
0
    def cmd_help(self, q):
        raise service.Return("""Commands I understand:
help|? - This
vol - Get volume
vol [num] - Set volume
vol up|down - Change volume
stop|stfu|skip|next - Remove the top video
pop|undo|oops - Remove the bottom video
bump - Move the bottom video to the top
q|queue - List the queue
cur|current - Give the current item playing
bug - Submit a bug report
Anything else - Queue Youtube video""")
Example #18
0
 def suggest(self, message):
     stripped_message = message.strip()
     suggestions = []
     for sc, sc_help in self.suggest_commands:
         if sc.startswith(stripped_message):
             suggestions.append({
                 "title": sc,
                 "action": sc,
                 "help": sc_help,
                 "match": len(stripped_message)
             })
     rs = yield self.wildcard_suggest(message)
     suggestions.extend(rs)
     raise service.Return({'suggestions': suggestions})
Example #19
0
 def youtube_suggest(self, q):
     videos = yield self.youtube_search(q)
     results = []
     for v in videos:
         results.append({
             "title":
             u"{0[title]} - [{0[duration][1]}]".format(v),
             "action":
             v['url'],
             "help":
             "Play video from YouTube",
             "match":
             0,
         })
     raise service.Return(results)
Example #20
0
    def cmd_set_vol(self, q, vol):
        if vol == 'up':
            result = yield self.vol_cmd("get_vol")
            vol = min(result['vol'] + 5, 100)
        elif vol == 'down':
            result = yield self.vol_cmd("get_vol")
            vol = max(result['vol'] - 5, 0)
        else:
            vol = int(vol)

        if vol > 100:
            raise Exception("Volume cannot be greater than 100")
        yield self.vol_cmd("set_vol", {"vol": vol})

        raise service.Return("Volume set to {0}".format(vol))
Example #21
0
 def cmd_fortune(self, q):
     fortune_args = settings.get("fortune_args", ['-s'])
     fortune_text = subprocess.check_output(['/usr/games/fortune'] +
                                            fortune_args)
     data = {
         'type': 'text',
         'args': {
             'text': fortune_text,
             #'screen_preprocessor': 'none',
             'speech_preprocessor': 'pronounce_fortune',
             'text2speech': 'google',
             'text2screen': 'paragraph',
             #'renderer': 'mono_paragraph',
             'duration': 5,
         }
     }
     yield self.queue_cmd("add", data)
     raise service.Return(u"Queued fortune.")
Example #22
0
 def cmd_image(self, q, url):
     yield self.queue_cmd("set_bg", {"type": "image", "args": {"url": url}})
     raise service.Return(u'Queued text.')
Example #23
0
 def cmd_update(self):
     #TODO: this is a temp fix until daemonized properly
     rc = self.import_queue_log()
     raise service.Return("Updated records")
Example #24
0
    def youtube_search(self, q):
        if q in self.youtube_cache:
            print "cache hit"
            raise service.Return(self.youtube_cache[q])
        print "cache miss"

        http_client = tornado.httpclient.AsyncHTTPClient()
        # Return the args dict for the first youtube result for 'match'
        youtube_search_url = "https://www.googleapis.com/youtube/v3/search"
        search_data = {
            "part": "snippet",
            "key": self.youtube_api_key,
            "order": "relevance",
            "safesearch": "none",
            "type": "video",
            "max-results": 5,
            "q": q,
        }
        query = q.replace(" ", "+")
        url = "https://www.youtube.com/results?search_query=" + query
        response = urllib2.urlopen(url)
        html = response.read()
        soup = BeautifulSoup(html, 'html.parser')
        video_ids = []
        output = []
        for vid in soup.findAll(attrs={'class': 'yt-uix-tile-link'}):
            video_ids.append(vid['href'][9:])
            print(vid)
            sr = {
                "video_id":
                vid['href'],
                "url":
                "https://www.youtube.com/watch?v={0}".format(vid['href'][9:]),
                "title":
                vid['title'],
                "thumbnail":
                "no",
                "publish_time":
                "no",
                "views":
                "no",
                "duration": (1, 1)
            }
            output.append(sr)

        #   output.append(sr)
        #youtube_video_url = "https://www.googleapis.com/youtube/v3/videos"
        #video_data = {
        #    "part": "contentDetails,snippet,statistics",
        #    "key": self.youtube_api_key,
        #    "id": ",".join(video_ids),
        #}
        #video_form_data = urllib.urlencode(video_data)
        #video_results = yield http_client.fetch(youtube_video_url + "?" + video_form_data)
        #video_json = json.loads(video_results.body)

        #output = []
        #for yi in video_json['items']:
        #   sr = {
        #      "video_id": yi["id"],
        #     "url": "http://www.youtube.com/watch?v={0}".format(yi["id"]),
        #    "title": yi["snippet"]["title"],
        #   "thumbnail": yi["snippet"]["thumbnails"]["default"]["url"],
        #  "publish_time": yi["snippet"]["publishedAt"],
        # "views": yi["statistics"]["viewCount"],
        #"duration": self.parse_duration(yi["contentDetails"]["duration"]),
        #}
        #output.append(sr)

        self.youtube_cache[q] = output
        raise service.Return(output)
Example #25
0
 def cmd_vote(self, message):
     raise service.Return("Not Implemented")
Example #26
0
 def get_state(self):
     raise service.Return(
         {name: self.devices[name].state
          for name in self.devices})
Example #27
0
 def cmd_youtube_raw(self, q, url):
     yield self.queue_cmd("add", {"type": "youtube", "args": {"url": url}})
     raise service.Return(u'Queued text.')
Example #28
0
 def cmd_say(self, q, text):
     yield self.queue_cmd("add", {"type": "text", "args": {"text": text}})
     raise service.Return(u'Queued text.')
Example #29
0
 def cmd_get_vol(self, q):
     result = yield self.vol_cmd("get_vol")
     raise service.Return("Volume is {0}".format(
         result.get("vol", "unknown")))