def os_query(qry): start = time.time() retval = os.system(qry) duration = time.time() - start if retval: logger.error("[%(duration).2fs], retval=%(retval)s, %(qry)s" % locals()) raise OSError("Cannot execute %(qry)s" % locals()) else: logger.info("[%(duration).2fs], retval=%(retval)s, %(qry)s" % locals())
def scrap_youtube_id(self, title): url = "http://www.youtube.com/results?search_query=%s" % urllib.quote_plus(title) page = requests.get(url, timeout=15) if 'Aucune vid' in page.content: logger.warning("No video found for %s" % str(self)) return None else: youtube_id = re.findall('href="\/watch\?v=(.*?)[&;"]', page.content)[0] logger.info("Found %s for song %s" % (youtube_id, str(self))) return youtube_id
def download(self, youtube_dl_bin, working_directory): if not self.youtube_id: logger.warning("Song %(self)s has no youtube id" % locals()) else: url = "https://www.youtube.com/watch?v=%s" % self.youtube_id tmp_fn = self.tmp_filename(working_directory).encode("utf8") fn = self.filename(working_directory).encode("utf8") if not os.path.exists(fn): os_query("""%(youtube_dl_bin)s --quiet --extract-audio --audio-format mp3 "%(url)s" -o "%(tmp_fn)s" """ % locals()) logger.info("Downloaded %(self)s" % locals()) else: logger.info("Skipped %(self)s, already downloaded" % locals())
def search_youtube_id(self, title): try: if not self.accessToken: self.get_access_token() headers = {'Authorization': 'Bearer ' + self.accessToken} url = 'https://www.googleapis.com/youtube/v3/search' r = requests.get(url, params={'part': 'snippet', 'q': title, 'type': 'video'}, headers=headers) items = r.json()['items'] if len(items) == 0: youtube_id = None logger.warning("No video found for %s" % title) else: youtube_id = items[0]['id']['videoId'] logger.info("Found %s for song %s" % (youtube_id, title)) return youtube_id except: logger.warning('YouTube API search error, fallback on scraper') return self.scrap_youtube_id(title)