diff --git a/changelog.md b/changelog.md index 8b89fc6..f50ab7f 100644 --- a/changelog.md +++ b/changelog.md @@ -10,10 +10,10 @@ * Added basic tagging for users in posts and comments. You can tag only people in your friends buffer. * Added a basic user profile viewer. * Added support for listening voice messages in chats. Currently it is not possible to send them, until the new API will be released. -* For now, all features related to audio playback have been disabled. * Fixed an error that was making Socializer unable to display chat history properly. It was showing the first 200 items in a conversation instead the last 200 items. Now chat will be displayed accordingly. * Changed the chat history widget from list of items to a read only text box, similar to how it was displayed in skype. Now the widget should be fully visible and messages will work in the same way. * It is possible to play songs sent in a chat message by opening them from the attachments panel. +* Reimplemented most of the audio playback methods. ## Changes in build 2016.07.08 (08/07/2016) diff --git a/src/controller/buffers.py b/src/controller/buffers.py index 53fe5ca..b7535f0 100644 --- a/src/controller/buffers.py +++ b/src/controller/buffers.py @@ -13,7 +13,7 @@ import selector import posts import attach from pubsub import pub -from vk.exceptions import VkAPIError +from vk_api.exceptions import VkApiError from wxUI.tabs import home from sessionmanager import session, renderers, utils from mysc.thread_utils import call_threaded @@ -78,7 +78,7 @@ class baseBuffer(object): retrieved = True # Control variable for handling unauthorised/connection errors. try: num = getattr(self.session, "get_newsfeed")(show_nextpage=show_nextpage, name=self.name, *self.args, **self.kwargs) - except VkAPIError as err: + except VkApiError as err: log.error(u"Error {0}: {1}".format(err.code, err.message)) retrieved = err.code return retrieved @@ -311,7 +311,7 @@ class feedBuffer(baseBuffer): retrieved = True try: num = getattr(self.session, "get_page")(show_nextpage=show_nextpage, name=self.name, *self.args, **self.kwargs) - except VkAPIMethodError as err: + except ValueError: log.error(u"Error {0}: {1}".format(err.code, err.message)) retrieved = err.code return retrieved @@ -677,7 +677,7 @@ class chatBuffer(baseBuffer): retrieved = True # Control variable for handling unauthorised/connection errors. try: num = getattr(self.session, "get_messages")(name=self.name, *self.args, **self.kwargs) - except VkAPIMethodError as err: + except ValueError as err: log.error(u"Error {0}: {1}".format(err.code, err.message)) retrieved = err.code return retrieved @@ -822,7 +822,7 @@ class requestsBuffer(peopleBuffer): retrieved = True try: ids = self.session.vk.client.friends.getRequests(*self.args, **self.kwargs) - except VkAPIMethodError as err: + except ValueError as err: log.error(u"Error {0}: {1}".format(err.code, err.message)) retrieved = err.code return retrieved diff --git a/src/sessionmanager/session.py b/src/sessionmanager/session.py index fd0c611..8d5386f 100644 --- a/src/sessionmanager/session.py +++ b/src/sessionmanager/session.py @@ -6,7 +6,7 @@ import vkSessionHandler import sound from config_utils import Configuration, ConfigurationResetException from pubsub import pub -from vk.exceptions import VkAPIError +from vk_api.exceptions import LoginRequired, VkApiError log = logging.getLogger("session") @@ -103,9 +103,8 @@ class vkSession(object): log.debug("Logged.") if result == False: self.authorise() - except VkAPIError as err: - if err.code == 5: - self.authorise() + except LoginRequired: + self.authorise() else: self.authorise() self.get_my_data() @@ -115,7 +114,7 @@ class vkSession(object): self.vk.login(self.settings["vk"]["user"], self.settings["vk"]["password"]) self.settings["vk"]["token"] = self.vk.client._session.access_token self.settings.write() - except: + except ValueError: self.settings["vk"]["user"] = "" self.settings["vk"]["password"] = "" self.settings.write() @@ -146,10 +145,19 @@ class vkSession(object): def get_page(self, name="", show_nextpage=False, endpoint="", *args, **kwargs): data = None + if "audio" in endpoint: + c = self.vk.client_audio + else: + c = self.vk.client if kwargs.has_key("parent_endpoint"): p = kwargs["parent_endpoint"] + if "audio" in p: + c = self.vk.client_audio kwargs.pop("parent_endpoint") - p = getattr(self.vk.client, p) + try: + p = getattr(c, p) + except AttributeError: + p = c log.debug("Calling endpoint %s with params %r" % (p, kwargs,)) data = getattr(p, endpoint)(*args, **kwargs) if data != None: diff --git a/src/sessionmanager/vkSessionHandler.py b/src/sessionmanager/vkSessionHandler.py index cc8834e..e6e6648 100644 --- a/src/sessionmanager/vkSessionHandler.py +++ b/src/sessionmanager/vkSessionHandler.py @@ -1,27 +1,31 @@ #!/usr/bin/python import keys import logging -from vk import API, AuthSession, Session +import vk_api +from vk_api.audio import VkAudio log = logging.getLogger("vkSessionHandler") class vkObject(object): def __init__(self): self.api_key = keys.keyring.get_api_key() - self.api_version = 5.84 - log.debug("Created vkSession using VK API Version %s" % (self.api_version,)) def login(self, user, password): log.debug("Logging in vk using user/password authentication") - s = AuthSession(app_id=self.api_key, user_login=user, user_password=password, scope="wall, notify, friends, photos, audio, video, docs, notes, pages, status, groups, messages, notifications, stats") - self.client = API(s, v=self.api_version) + vk_session = vk_api.VkApi(app_id=self.api_key, login=user, password=password, scope="wall, notify, friends, photos, audio, video, docs, notes, pages, status, groups, messages, notifications, stats") + vk_session.auth() + self.client = vk_session.get_api() +# self.client = API(s, v=self.api_version) log.debug("Getting tokens for 24 hours...") self.client.account.getProfileInfo() # Add session data to the application statistics. self.client.stats.trackVisitor() + self.client_audio = VkAudio(vk_session) def login_access_token(self, token): log.debug("Logging in VK using stored tokens...") - s = Session(access_token=token) - self.client = API(s, v=self.api_version) + vk_session = vk_api.VkApi(app_id=self.api_key, token=token, scope="wall, notify, friends, photos, audio, video, docs, notes, pages, status, groups, messages, notifications, stats") + vk_session.auth() + self.client = vk_session.get_api() + self.client_audio = VkAudio(vk_session) return self.client.account.getProfileInfo() \ No newline at end of file