fix vk audio
This commit is contained in:
		
							
								
								
									
										38
									
								
								feeds/modules/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								feeds/modules/utils.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					import tempfile
 | 
				
			||||||
 | 
					from io import BytesIO
 | 
				
			||||||
 | 
					from uuid import uuid4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_vk_audio(m3u8):
 | 
				
			||||||
 | 
					    with tempfile.TemporaryDirectory() as d:
 | 
				
			||||||
 | 
					        fname = '{}.mp3'.format(uuid4())
 | 
				
			||||||
 | 
					        path = os.path.join(d, fname)
 | 
				
			||||||
 | 
					        subprocess.check_output(['ffmpeg', '-i', m3u8, path])
 | 
				
			||||||
 | 
					        with open(path, 'rb') as f:
 | 
				
			||||||
 | 
					            tf = BytesIO(f.read())
 | 
				
			||||||
 | 
					            tf.name = fname
 | 
				
			||||||
 | 
					            tf.seek(0)
 | 
				
			||||||
 | 
					            return tf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_vk_photo(attachment):
 | 
				
			||||||
 | 
					    for size in (2560, 1280, 807, 604, 130, 75):
 | 
				
			||||||
 | 
					        if f'photo_{size}' in attachment:
 | 
				
			||||||
 | 
					            return attachment[f'photo_{size}']
 | 
				
			||||||
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_file(url):
 | 
				
			||||||
 | 
					    fname = '?'.join(url.split('?')[:-1])
 | 
				
			||||||
 | 
					    extension = os.path.basename(fname).split('.')[-1]
 | 
				
			||||||
 | 
					    f = tempfile.NamedTemporaryFile(suffix=f'.{extension}' if extension else None)
 | 
				
			||||||
 | 
					    r = requests.get(url, stream=True)
 | 
				
			||||||
 | 
					    for chunk in r.iter_content(1024 * 1024):
 | 
				
			||||||
 | 
					        if chunk:
 | 
				
			||||||
 | 
					            f.write(chunk)
 | 
				
			||||||
 | 
					    f.seek(0)
 | 
				
			||||||
 | 
					    return f
 | 
				
			||||||
@@ -13,28 +13,10 @@ from vk_api import VkApi
 | 
				
			|||||||
from vk_api.audio import VkAudio
 | 
					from vk_api.audio import VkAudio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from feeds.models import FeedModuleConfig
 | 
					from feeds.models import FeedModuleConfig
 | 
				
			||||||
 | 
					from feeds.modules.utils import get_vk_photo, get_vk_audio
 | 
				
			||||||
from feeds.utils import DatabaseConfig, captcha_handler
 | 
					from feeds.utils import DatabaseConfig, captcha_handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_vk_photo(attachment):
 | 
					 | 
				
			||||||
    for size in (2560, 1280, 807, 604, 130, 75):
 | 
					 | 
				
			||||||
        if f'photo_{size}' in attachment:
 | 
					 | 
				
			||||||
            return attachment[f'photo_{size}']
 | 
					 | 
				
			||||||
    return None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_file(url):
 | 
					 | 
				
			||||||
    fname = '?'.join(url.split('?')[:-1])
 | 
					 | 
				
			||||||
    extension = os.path.basename(fname).split('.')[-1]
 | 
					 | 
				
			||||||
    f = tempfile.NamedTemporaryFile(suffix=f'.{extension}' if extension else None)
 | 
					 | 
				
			||||||
    r = requests.get(url, stream=True)
 | 
					 | 
				
			||||||
    for chunk in r.iter_content(1024 * 1024):
 | 
					 | 
				
			||||||
        if chunk:
 | 
					 | 
				
			||||||
            f.write(chunk)
 | 
					 | 
				
			||||||
    f.seek(0)
 | 
					 | 
				
			||||||
    return f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VKFeedModuleConfig(FeedModuleConfig):
 | 
					class VKFeedModuleConfig(FeedModuleConfig):
 | 
				
			||||||
    owner_id = models.IntegerField()
 | 
					    owner_id = models.IntegerField()
 | 
				
			||||||
    send_text = models.BooleanField(default=True)
 | 
					    send_text = models.BooleanField(default=True)
 | 
				
			||||||
@@ -71,7 +53,7 @@ class VKFeedModuleConfig(FeedModuleConfig):
 | 
				
			|||||||
                            bot.send_media_group(chat_id, [InputMediaPhoto(photo) for photo in photos])
 | 
					                            bot.send_media_group(chat_id, [InputMediaPhoto(photo) for photo in photos])
 | 
				
			||||||
                        for a in post['attachments']:
 | 
					                        for a in post['attachments']:
 | 
				
			||||||
                            if 'audio' in a:
 | 
					                            if 'audio' in a:
 | 
				
			||||||
                                f = get_file(vk_audio.get_audio_by_id(a['audio']['owner_id'], a['audio']['id']))
 | 
					                                f = get_vk_audio(vk_audio.get_audio_by_id(a['audio']['owner_id'], a['audio']['id']))
 | 
				
			||||||
                                bot.send_audio(chat_id, f, None, a['audio'].get('artist'), a['audio'].get('title'))
 | 
					                                bot.send_audio(chat_id, f, None, a['audio'].get('artist'), a['audio'].get('title'))
 | 
				
			||||||
                    if self.send_links:
 | 
					                    if self.send_links:
 | 
				
			||||||
                        bot.send_message(chat_id, f"https://vk.com/wall{post['owner_id']}_{post['id']}",
 | 
					                        bot.send_message(chat_id, f"https://vk.com/wall{post['owner_id']}_{post['id']}",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,31 +11,10 @@ from vk_api import VkApi
 | 
				
			|||||||
from vk_api.audio import VkAudio
 | 
					from vk_api.audio import VkAudio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from feeds.models import FeedModuleConfig
 | 
					from feeds.models import FeedModuleConfig
 | 
				
			||||||
 | 
					from feeds.modules.utils import get_vk_audio
 | 
				
			||||||
from feeds.utils import DatabaseConfig, captcha_handler
 | 
					from feeds.utils import DatabaseConfig, captcha_handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_vk_photo(attachment):
 | 
					 | 
				
			||||||
    for size in (2560, 1280, 807, 604, 130, 75):
 | 
					 | 
				
			||||||
        if f'photo_{size}' in attachment:
 | 
					 | 
				
			||||||
            return attachment[f'photo_{size}']
 | 
					 | 
				
			||||||
    return None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_file(url, session=None):
 | 
					 | 
				
			||||||
    if session is None:
 | 
					 | 
				
			||||||
        session = requests
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fname = '?'.join(url.split('?')[:-1])
 | 
					 | 
				
			||||||
    extension = os.path.basename(fname).split('.')[-1]
 | 
					 | 
				
			||||||
    f = tempfile.NamedTemporaryFile(suffix=f'.{extension}' if extension else None)
 | 
					 | 
				
			||||||
    r = session.get(url, stream=True)
 | 
					 | 
				
			||||||
    for chunk in r.iter_content(1024 * 1024):
 | 
					 | 
				
			||||||
        if chunk:
 | 
					 | 
				
			||||||
            f.write(chunk)
 | 
					 | 
				
			||||||
    f.seek(0)
 | 
					 | 
				
			||||||
    return f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VKMusicFeedModuleConfig(FeedModuleConfig):
 | 
					class VKMusicFeedModuleConfig(FeedModuleConfig):
 | 
				
			||||||
    owner_id = models.IntegerField()
 | 
					    owner_id = models.IntegerField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,7 +42,7 @@ class VKMusicFeedModuleConfig(FeedModuleConfig):
 | 
				
			|||||||
            else:
 | 
					            else:
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
        for track in lst:
 | 
					        for track in lst:
 | 
				
			||||||
            f = get_file(track['url'], vk_session.http)
 | 
					            f = get_vk_audio(track['url'])
 | 
				
			||||||
            bot.send_audio(chat_id, f, duration=track['duration'], performer=track['artist'],
 | 
					            bot.send_audio(chat_id, f, duration=track['duration'], performer=track['artist'],
 | 
				
			||||||
                           title=track['title'], timeout=40)
 | 
					                           title=track['title'], timeout=40)
 | 
				
			||||||
            yield track['id']
 | 
					            yield track['id']
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user