예제 #1
0
 def vka(text, i):
     import vk_api
     from vk_api.audio import VkAudio
     login, password = '******', 'oyatillo99'  #vk.com dagi login parolizi kiritasiz
     vk_session = vk_api.VkApi(login, password)
     try:
         vk_session.auth()
     except vk_api.AuthError as error_msg:
         bot1.send_message(630751054, error_msg)
     vkaudio = VkAudio(vk_session)
     lis = []
     if i == 1:
         tracks = vkaudio.search(q=text, count=i)
         for track in tracks:
             title = track['title']
             artist = track['artist']
             url = track['url'].split('?')[0]
             lis = [str(title), str(artist), url]
             if lis:
                 break
     else:
         group = []
         tracks = vkaudio.search(q=text)
         for track in tracks:
             title = track['title']
             artist = track['artist']
             url = track['url'].split('?')[0]
             group = [str(artist), str(title), url]
             lis.append(group)
     return tracks
예제 #2
0
 def vka(text, i):
     import vk_api
     from vk_api.audio import VkAudio
     login, password = '******', 'PASSWORD'  #vk.com dagi login parolizi kiritasiz
     vk_session = vk_api.VkApi(login, password)
     try:
         vk_session.auth()
     except vk_api.AuthError as error_msg:
         print(error_msg)
     vkaudio = VkAudio(vk_session)
     lis = []
     if i == 1:
         tracks = vkaudio.search(q=text, count=i)
         for track in tracks:
             title = track['title']
             artist = track['artist']
             url = track['url'].split('?')[0]
             lis = [str(title), str(artist), url]
             if lis:
                 break
     else:
         group = []
         tracks = vkaudio.search(q=text)
         for track in tracks:
             title = track['title']
             artist = track['artist']
             url = track['url'].split('?')[0]
             group = [str(artist), str(title), url]
             lis.append(group)
     return lis
예제 #3
0
def main():
    """ Пример составления топа исполнителей для профиля вк """

    login, password = '******', 'password'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.auth()
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return

    vkaudio = VkAudio(vk_session)

    artists = collections.Counter()

    for track in vkaudio.get_iter(-99463083):
        artists[track['artist']] += 1

    # Составляем рейтинг первых 15
    print('\nTop 15:')
    for artist, tracks in artists.most_common(15):
        print('{} - {} tracks'.format(artist, tracks))

    # Ищем треки самого популярного
    most_common_artist = artists.most_common(1)[0][0]

    print('\nSearch for', most_common_artist)

    tracks = vkaudio.search(q=most_common_artist)[:10]

    for n, track in enumerate(tracks, 1):
        print('{}. {} {}'.format(n, track['title'], track['url']))
예제 #4
0
def search_aidio(Choice_fanc: str, vk_sessions: vk_api.vk_api.VkApi, name: str,
                 count: int):
    """
    Поиск аудио записей из общего поиска вк
    или из плей листа пользователя
    """
    #_________________________________________________#

    vkaudio = VkAudio(vk_sessions)
    if Choice_fanc == 'all':
        search_111 = []
        for lists_music in vkaudio.search(name, count):
            search_111.append((lists_music['artist'], lists_music['title'],
                               lists_music['url']))
        return search_111

    if Choice_fanc == 'id':
        search_111 = []
        if not isinstance(name, int):
            try:
                name = int(name)
            except ValueError:
                return False

        for lists_music in enumerate(vkaudio.get_iter(owner_id=name)):
            if lists_music[0] <= count:
                search_111.append(
                    (lists_music[1]['artist'], lists_music[1]['title'],
                     lists_music[1]['url']))
            else:
                break
        return search_111

    return False
예제 #5
0
def main():
    """ Пример составления топа исполнителей для профиля вк """

    login, password = '******', 'password'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.auth()
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return

    vkaudio = VkAudio(vk_session)

    artists = collections.Counter(
        track['artist'] for track in vkaudio.get_iter()
    )

    # Составляем рейтинг первых 15
    print('Top 15:')
    for artist, tracks in artists.most_common(15):
        print('{} - {} tracks'.format(artist, tracks))

    # Ищем треки самого популярного
    most_common_artist = artists.most_common(1)[0][0]

    print('\nSearching for {}:'.format(most_common_artist))

    tracks = vkaudio.search(q=most_common_artist, count=10)

    for n, track in enumerate(tracks, 1):
        print('{}. {} {}'.format(n, track['title'], track['url']))
예제 #6
0
class VkMusic:
    def authVk(self, login, password, flag):
        try:
            self.session = vk_api.VkApi(login, password)
            self.session.auth()
            self.setVkAudio()
        except Exception:
            flag.append(0)
        else:
            self.api = self.session.get_api()
            flag.append(1)

    def setVkAudio(self):
        self.vkAudio = VkAudio(self.session)

    def getUserPhoto(self):
        return self.api.photos.get(
            album_id='profile')["items"][-1]["sizes"][0]["url"]

    def getUserInfo(self):
        return self.api.users.get()[0]

    def getUserMusic(self, userList):
        music = []
        music.extend(self.vkAudio.get())
        userList[0] = music

    def getMusic(self, name, findedMusic):
        music = []
        music.extend(self.vkAudio.search(name, count=500))
        findedMusic[0] = music
예제 #7
0
    def getting_audios(self):
        vk_audio = VkAudio(self.VK)

        artists = collections.Counter(track['artist']
                                      for track in vk_audio.get_iter())
        most_common_artist = artists.most_common(1)[0][0]

        tracks = vk_audio.search(q=most_common_artist, count=10)
        self.audios = []
        for self.n, self.track in enumerate(tracks, 1):
            self.audios.append(self.track['title'])
예제 #8
0
def search_audios(update, context):
    global playlist_type
    global vk_session
    global searched_tracks

    update.message.reply_text('Searching...')

    vkaudio = VkAudio(vk_session)
    searched_tracks = list(vkaudio.search(update.message.text))

    playlist_type = 'searched'

    playlist = make_playlist(playlist_type)
    update.message.reply_text('Playlist:', reply_markup=playlist)
예제 #9
0
    def post(self):
        print(request)
        vk_session = vk_api.VkApi(app_id=3380204, client_secret='Ky3xN0ohvtMzaVgCYU80')
        vk_session.code_auth(request.json()['code'], request.json()['redirectUri'])
        token = vk_session.token['access_token']

        vkaudio = VkAudio(vk_session)
        print([x for x in vkaudio.search('sandstorm')])
        """
        'code' (139893782146720) = {str} 'f2addb2855bb6b95b5'
'clientId' (139893782181168) = {str} '3380204'
'redirectUri' (139893782180784) = {str} 'https://192.168.20.37:8080/'
        """
        return {"status": request, 'access_token': 'fdsafsad'}, 200
예제 #10
0
def main():
    """ Пример составления топа исполнителей для профиля вк """

    login, password = '******', 'pomogite'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.auth()
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return

    vkaudio = VkAudio(vk_session)

    artists = collections.Counter()

    offset = 0

    while True:
        audios = vkaudio.get(owner_id=124250662, offset=offset)

        if not audios:
            break

        for audio in audios:
            artists[audio['artist']] += 1

        offset += len(audios)

    # Составляем рейтинг первых 15
    print('\nTop 15:')
    for artist, tracks in artists.most_common(15):
        print('{} - {} tracks'.format(artist, tracks))

    # Ищем треки самого популярного
    most_common_artist = artists.most_common(1)[0][0]

    print('\nSearch for', most_common_artist)

    tracks = vkaudio.search(q=most_common_artist)[:10]

    for n, track in enumerate(tracks, 1):
        print('{}. {} {}'.format(n, track['title'], track['url']))
예제 #11
0
def main():
    """ Пример составления топа исполнителей для профиля вк """

    login, password = '******', 'password'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.auth()
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return

    vkaudio = VkAudio(vk_session)

    artists = collections.Counter()

    offset = 0

    while True:
        audios = vkaudio.get(owner_id=-99463083, offset=offset)

        if not audios:
            break

        for audio in audios:
            artists[audio['artist']] += 1

        offset += len(audios)

    # Составляем рейтинг первых 15
    print('\nTop 15:')
    for artist, tracks in artists.most_common(15):
        print('{} - {} tracks'.format(artist, tracks))

    # Ищем треки самого популярного
    most_common_artist = artists.most_common(1)[0][0]

    print('\nSearch for', most_common_artist)

    tracks = vkaudio.search(q=most_common_artist)[:10]

    for n, track in enumerate(tracks, 1):
        print('{}. {} {}'.format(n, track['title'], track['url']))
예제 #12
0
class VkSongs(object):
    """VK-Songs downloads VK audio files"""
    def __init__(self):
        self.logger = VkSongs.get_logger(level=logging.DEBUG)  # TODO: Configurable log
        self.session = requests.Session()

        self.is_logged_in = False

        self.vk = None
        self.vk_audio = None

    def login(self, login_user, login_pass):
        """Logs in to VK"""
        vk_session = vk_api.VkApi(
            login_user, login_pass,
            auth_handler=self.two_factor_handler,
            captcha_handler=self.captcha_handler,
            app_id=6692066,
        )

        try:
            vk_session.auth()
        except vk_api.AuthError as error_msg:
            self.logger.error('Login failed for {0}. Reason: {1}'.format(login_user, error_msg))
            return

        self.vk = vk_session.get_api()
        self.vk_audio = VkAudio(vk_session)
        self.is_logged_in = True

    @staticmethod
    def two_factor_handler():
        key = input("♫ Enter authentication code: ")
        remember_device = True

        return key, remember_device

    @staticmethod
    def captcha_handler(captcha):
        #  TODO: Implement it using PyInquirer
        key = input("♫ Enter captcha code {0}: ".format(captcha.get_url())).strip()

        return captcha.try_again(key)

    @staticmethod
    def get_color(level):
        print(level)
        if level == 'ERROR':
            return Fore.RED
        elif level == 'WARNING':
            return Fore.YELLOW
        else:
            return ''

    @staticmethod
    def get_logger(level=logging.DEBUG):
        """Returns a logger"""
        logger = logging.getLogger(__name__)

        fh = logging.FileHandler('vk-songs.log', 'w')
        fh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        fh.setLevel(level)
        logger.addHandler(fh)

        import sys
        sh = logging.StreamHandler(sys.stdout)
        sh.setFormatter(logging.Formatter(Fore.RED + '%(levelname)s: %(message)s'))
        sh.setLevel(logging.ERROR)
        logger.addHandler(sh)

        return logger

    def download(self, song, save_dir='./', tag=False):
        """Downloads the media file"""
        from pathvalidate import sanitize_filename
        import eyed3
        from eyed3.id3 import ID3_V2_4
        url = song.url
        base_name = '{0} - {1}.mp3'.format(song.artist.strip(), song.title.strip())  # TODO: Configurable file mask
        base_name = sanitize_filename(base_name, replacement_text='_')
        file_path = os.path.join(save_dir, base_name)

        if not os.path.isfile(file_path):
            import time
            with open(file_path, 'wb') as media_file:
                try:
                    content = self.session.get(url).content
                except requests.exceptions.ConnectionError:
                    time.sleep(5)
                    content = self.session.get(url).content

                media_file.write(content)

            file_time = time.time()
            os.utime(file_path, (file_time, file_time))

            if tag:
                audio_file = eyed3.load(file_path)
                eyed3.core.log.disabled = True
                eyed3.id3.log.disabled = True
                if audio_file:
                    if not audio_file.tag:
                        audio_file.initTag(version=ID3_V2_4)
                    audio_file.tag.artist = song.artist
                    audio_file.tag.album_artist = song.artist
                    audio_file.tag.title = song.title
                    if song.album is not None:
                        audio_file.tag.album = song.album
                    audio_file.tag.save(version=ID3_V2_4, encoding='utf_8')

            return True
        else:
            return False

    def search(self, query):
        search = self.vk_audio.search(q=query)  # TODO: Generator
        result = []
        for audio in search:
            audio['url'] = audio['url'].split('?', 1)[0]
            result.append(VkSong(num=audio['id'], artist=audio['artist'], title=audio['title'], url=audio['url']))
        if len(result) == 0:
            self.logger.error('No songs found')
        return result

    def search_user(self, owner_id, query):
        search = self.vk_audio.search_user(owner_id=owner_id, q=query)
        result = []
        for audio in search:
            audio['url'] = audio['url'].split('?', 1)[0]
            result.append(VkSong(num=audio['id'], artist=audio['artist'], title=audio['title'], url=audio['url']))
        if len(result) == 0:
            self.logger.error('No songs found')
        return result

    def get_albums(self, owner_id):
        albums = self.vk_audio.get_albums(owner_id=owner_id)  # TODO: Generator
        result = []
        for album in albums:
            result.append(VkAlbum(title=album['title'], album_id=album['id'], owner_id=album['owner_id']))
        if len(result) == 0:
            self.logger.error('No albums found')
        return result

    def get(self, owner_id=None, album_id=None, album_title=None):
        songs = self.vk_audio.get(owner_id=owner_id, album_id=album_id)  # TODO: Generator
        result = []
        for audio in songs:
            audio['url'] = audio['url'].split('?', 1)[0]
            result.append(VkSong(num=audio['id'], artist=audio['artist'],
                                 title=audio['title'], url=audio['url'], album=album_title))
        if len(result) == 0:
            self.logger.error('No songs found')
        return result

    @staticmethod
    def should_login(dict):
        # TODO: Implement user session caching
        return True

    @staticmethod
    def make_dst_dir(destination='./', artist='/'):
        """Creates the destination directory."""
        destination = destination + artist

        try:
            os.makedirs(destination)
        except OSError as err:
            import errno
            if err.errno == errno.EEXIST and os.path.isdir(destination):
                # Directory already exists
                pass
            else:
                # Target dir exists as a file, or a different error
                raise

        return destination
예제 #13
0
파일: main.py 프로젝트: amdemin/Music
def process_input(message, page=1, text=""):
    text = message.text
    try:

        # this code is used to identify repeated requests from one input
        text = text.split("• ")
        if len(text) > 1:
            text = text[1]
        else:
            text = text[0]

        keyboard = types.InlineKeyboardMarkup()

        # retrieve songs from the private dropbox cloud
        if 'dropbox' in text:
            cut_text = text.strip('dropbox')
            result = extract_music_files(cut_text, music_dict)
            # split list into small sublists limited by 10
            result_split_page = [
                result[x:x + 10] for x in range(0, len(result), 10)
            ]
            # add button to telegram according to page numeration
            page_file = page - 1
        # retrieve songs from public vk
        else:

            # autorisation process
            vk_session = vk_api.VkApi(vk_login, vk_password)
            vk_session.auth(token_only=True)
            vk = vk_session.get_api()
            vk_audio = VkAudio(vk_session)
            ###

            result = []
            page_file = 0
            number_of_songs = len(
                list(vk_audio.search(text, count=15, offset=0)))
            time.sleep(rd.uniform(0.5, 1.1))
            tracks = list(vk_audio.search(text, count=5,
                                          offset=5 * (page - 1)))
            for song in range(0, len(tracks)):
                row = []
                row.append(tracks[song]['artist'] + ' ' +
                           tracks[song]['title'])
                row.append(tracks[song]['owner_id'])
                row.append(tracks[song]['id'])
                result.append(row)
            result_split_page = [
                result[x:x + 5] for x in range(0, number_of_songs, 5)
            ]

        print(result)

        audio_format = ".mp3"
        if len(result_split_page) != 0:
            for i in range(0, len(result_split_page[page_file])):
                if ".mp3" in result_split_page[page_file][i][0]:
                    result_split_page[page_file][i][0] = result_split_page[
                        page_file][i][0].replace(".mp3", "")
                    # audio_format = ".mp3"
                # callback_data API is limited to 64 bytes (64 letters long)
                button = types.InlineKeyboardButton(
                    text=result_split_page[page_file][i][0],
                    callback_data="audio_row;" + str(i) + ";" + audio_format +
                    ";" + str(result_split_page[page_file][i][1]) + ";" +
                    str(result_split_page[page_file][i][2]))
                keyboard.add(button)

            # initiate paginator
            paginator = InlineKeyboardPaginator(int(len(result_split_page)),
                                                current_page=page,
                                                data_pattern='page;{page};' +
                                                str(text))

            bot.send_message(message.chat.id,
                             "Found songs: ",
                             reply_markup=keyboard)
            if len(result_split_page) > 1:
                # send number of pages when at least more than one
                bot.send_message(message.chat.id,
                                 "Page: " + str(page) + " • " + str(text),
                                 reply_markup=paginator.markup,
                                 parse_mode='Markdown')
        else:
            bot.send_message(message.chat.id, "No results")
    except Exception as e:
        print('Error in process_input:', e)
        print(traceback.format_exc())
        # bot.send_message(message.from_user.id, e)
        bot.send_message(message.chat.id, "Error occured, no results")
예제 #14
0
 def make_search(self, track, chat_id):
     vkaudio = VkAudio(self.vk_session)
     self.tracks[chat_id] = vkaudio.search(track, offset=0)