File indexing completed on 2024-10-13 13:10:05

0001 # -*- coding: utf-8 -*-
0002 
0003 from __future__ import unicode_literals
0004 import requests
0005 from os.path import dirname
0006 import sys
0007 import youtube_dl
0008 import json
0009 from adapt.intent import IntentBuilder
0010 from bs4 import BeautifulSoup
0011 from mycroft.skills.core import MycroftSkill
0012 from mycroft.messagebus.message import Message
0013 import threading
0014 import collections
0015 
0016 __author__ = 'aix'
0017 searchlst = {}
0018 soundlst = []
0019 searchlstobject = []
0020 current_song = ""
0021  
0022 class SoundcloudSkill(MycroftSkill):
0023     def __init__(self):
0024         super(SoundcloudSkill, self).__init__(name="SoundcloudSkill")
0025         self.process = None
0026         self.genMusicSearchList = None
0027 
0028     def initialize(self):
0029         self.load_data_files(dirname(__file__))
0030         
0031         self.add_event('soundcloud-audio-player.aiix.home', self.showHome)
0032 
0033         soundcloud = IntentBuilder("SoundcloudKeyword"). \
0034             require("SoundcloudKeyword").build()
0035         self.register_intent(soundcloud, self.soundcloud)
0036         
0037         soundcloudpause = IntentBuilder("SoundcloudPauseKeyword"). \
0038             require("SoundcloudPauseKeyword").build()
0039         self.register_intent(soundcloudpause, self.soundcloudpause)
0040         
0041         soundcloudresume = IntentBuilder("SoundcloudResumeKeyword"). \
0042             require("SoundcloudResumeKeyword").build()
0043         self.register_intent(soundcloudresume, self.soundcloudresume)
0044         
0045         soundcloudnext = IntentBuilder("SoundcloudNextKeyword"). \
0046             require("SoundcloudNextKeyword").build()
0047         self.register_intent(soundcloudnext, self.soundcloudnext)
0048         
0049         soundcloudprevious = IntentBuilder("SoundcloudPreviousKeyword"). \
0050             require("SoundcloudPreviousKeyword").build()
0051         self.register_intent(soundcloudprevious, self.soundcloudprevious)
0052         
0053         self.gui.register_handler('aiix.soundcloud-audio-player.next', self.soundcloudnext)
0054         self.gui.register_handler('aiix.soundcloud-audio-player.previous', self.soundcloudprevious)
0055         self.gui.register_handler('aiix.soundcloud-audio-player.playtitle', self.soundplayselection)
0056 
0057     def showHome(self, message):
0058         self.gui.clear()
0059         self.displayHome()
0060         
0061     def displayHome(self):
0062         self.gui.show_page("homepage.qml")
0063         
0064     def search(self, text):
0065         global soundlst
0066         global current_song
0067         query = text
0068         url = "https://soundcloud.com/search/sounds?q=" + query
0069         response = requests.get(url)
0070         soup = BeautifulSoup(response.content, 'html.parser')
0071         for link in soup.find_all('h2'):
0072             for x in link.find_all('a'):
0073                r = x.get('href')
0074                countOfWords = collections.Counter(r)
0075                result = [i for i in countOfWords if countOfWords[i]>1]
0076                if "/" in result:
0077                  soundlst.append("https://soundcloud.com" + x.get('href'))
0078         
0079         if len(soundlst) != 0:
0080             genMusicUrl = soundlst[0]
0081             self.genMusicSearchList = threading.Thread(target=self.getSearchListInfo, args=[soundlst])
0082             self.genMusicSearchList.start()
0083             return genMusicUrl
0084         else:
0085             self.speak("No Song Found")
0086             return False
0087         
0088     def soundcloud(self, message):
0089         self.stop()
0090         global soundlst
0091         global current_song
0092         soundlst.clear()
0093         utterance = message.data.get('utterance').lower()
0094         utterance = utterance.replace(
0095             message.data.get('SoundcloudKeyword'), '')
0096         aud = self.search(utterance)
0097         urlvideo = aud
0098         if urlvideo is not False:
0099             ydl_opts = {}
0100             with youtube_dl.YoutubeDL(ydl_opts) as ydl:
0101                 info_dict = ydl.extract_info(urlvideo, download=False)
0102                 audio_url = info_dict.get("url", None)
0103                 audio_title = info_dict.get('title', None)
0104                 audio_thumb = info_dict.get('thumbnail', None)
0105             print(audio_url, audio_title, audio_thumb)
0106             self.gui.clear()
0107             self.gui["audioTitle"] = str(audio_title)
0108             self.gui["audioSource"] = str(audio_url)
0109             self.gui["audioThumbnail"] = str(audio_thumb)
0110             self.gui["scSearchBlob"] = {} 
0111             self.gui["status"] = str("play")
0112             current_song = urlvideo
0113             print(current_song)
0114             self.gui.show_pages(["SoundCloudPlayer.qml", "SoundcloudSearch.qml"], 0, override_idle=True)
0115         
0116     def soundcloudpause(self, message):
0117         self.enclosure.bus.emit(Message("metadata", {"type": "soundcloud-audio-player", "status": str("pause")}))
0118 
0119     def soundcloudresume(self, message):
0120         self.enclosure.bus.emit(Message("metadata", {"type": "soundcloud-audio-player", "status": str("play")}))
0121         
0122     def soundcloudnext(self, message):
0123         global soundlst
0124         global current_song
0125         current_index = soundlst.index(current_song)
0126         if (current_index == len(soundlst)-1): 
0127             current_song = soundlst[0]
0128         else:
0129             current_song = soundlst[current_index+1]
0130             print(current_song)
0131                 
0132         urlvideo = current_song
0133         ydl_opts = {}
0134         with youtube_dl.YoutubeDL(ydl_opts) as ydl:
0135                 info_dict = ydl.extract_info(urlvideo, download=False)
0136                 audio_url = info_dict.get("url", None)
0137                 audio_title = info_dict.get('title', None)
0138                 audio_thumb = info_dict.get('thumbnail', None)
0139         print(audio_url, audio_title, audio_thumb)
0140         self.gui["audioTitle"] = str(audio_title)
0141         self.gui["audioSource"] = str(audio_url)
0142         self.gui["audioThumbnail"] = str(audio_thumb)
0143         self.gui["scSearchBlob"] = {} 
0144         self.gui["status"] = str("play")
0145         current_song = urlvideo
0146         print(current_song)
0147         self.gui.show_page("SoundCloudPlayer.qml")
0148         
0149         
0150     def soundcloudprevious(self, message):
0151         global soundlst
0152         global current_song
0153         current_index = soundlst.index(current_song)
0154         if(current_index == 0):
0155             current_song = soundlst[len(soundlst)-1]
0156         else:
0157             current_song = soundlst[current_index - 1]
0158             print(current_song)
0159                 
0160         urlvideo = current_song
0161         ydl_opts = {}
0162         with youtube_dl.YoutubeDL(ydl_opts) as ydl:
0163             info_dict = ydl.extract_info(urlvideo, download=False)
0164             audio_url = info_dict.get("url", None)
0165             audio_title = info_dict.get('title', None)
0166             audio_thumb = info_dict.get('thumbnail', None)
0167         print(audio_url, audio_title, audio_thumb)
0168         self.gui["audioTitle"] = str(audio_title)
0169         self.gui["audioSource"] = str(audio_url)
0170         self.gui["audioThumbnail"] = str(audio_thumb)
0171         self.gui["scSearchBlob"] = {} 
0172         self.gui["status"] = str("play")
0173         current_song = urlvideo
0174         print(current_song)
0175         self.gui.show_page("SoundCloudPlayer.qml")
0176 
0177     def getSearchListInfo(self, soundlst):
0178         global searchlst
0179         global searchlstobject
0180         ydl_opts = {}
0181         ydl = youtube_dl.YoutubeDL(ydl_opts)
0182         searchlstobject.clear();
0183         for x in range(len(soundlst)):
0184             info_dict = ydl.extract_info(soundlst[x], download=False)
0185             searchlstobject.append({"title": info_dict.get("title", None), "url": info_dict.get("url", None), "thumbnail": info_dict.get("thumbnail", None)})
0186             result = json.dumps(searchlstobject)
0187             self.gui["scSearchBlob"] = result
0188             
0189         if self.genMusicSearchList is not None:
0190             sys.exit()
0191         else:
0192             print("process is None")
0193             
0194     def soundplayselection(self, message):
0195         self.stop()
0196         global soundlst
0197         global current_song
0198         soundlst.clear()
0199         utterance = message.data["playtitle"].lower()
0200         aud = self.search(utterance)
0201         urlvideo = aud
0202         if urlvideo is not False:
0203             ydl_opts = {}
0204             with youtube_dl.YoutubeDL(ydl_opts) as ydl:
0205                 info_dict = ydl.extract_info(urlvideo, download=False)
0206                 audio_url = info_dict.get("url", None)
0207                 audio_title = info_dict.get('title', None)
0208                 audio_thumb = info_dict.get('thumbnail', None)
0209             print(audio_url, audio_title, audio_thumb)
0210             self.gui["audioTitle"] = str(audio_title)
0211             self.gui["audioSource"] = str(audio_url)
0212             self.gui["audioThumbnail"] = str(audio_thumb)
0213             self.gui["scSearchBlob"] = {} 
0214             self.gui["status"] = str("play")
0215             current_song = urlvideo
0216             print(current_song)
0217             self.gui.show_pages(["SoundCloudPlayer.qml", "SoundcloudSearch.qml"], 0, override_idle=True)
0218 
0219     def stop(self):
0220         self.enclosure.bus.emit(Message("metadata", {"type": "stop"}))
0221         if self.process:
0222             self.process.terminate()
0223             self.process.wait()
0224         pass
0225 
0226 def create_skill():
0227     return SoundcloudSkill()