Skip to content

Commit

Permalink
Add types instead dicts [#11] Fix annotations for medias/users modules
Browse files Browse the repository at this point in the history
  • Loading branch information
adw0rd committed Nov 6, 2020
1 parent faabcfc commit afb1c55
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 47 deletions.
42 changes: 8 additions & 34 deletions instagrapi/media.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
MediaNotFound,
)
from .extractors import extract_media_v1, extract_media_gql, extract_comment, extract_media_oembed
from .types import Usertag, Location, UserShort
from .types import Usertag, Location, UserShort, Media, Comment


class Media:
Expand Down Expand Up @@ -56,7 +56,7 @@ def media_pk_from_url(self, url: str) -> int:
parts = [p for p in path.split("/") if p]
return self.media_pk_from_code(parts.pop())

def media_info_a1(self, media_pk: int, max_id=None) -> dict:
def media_info_a1(self, media_pk: int, max_id=None) -> Media:
media_pk = self.media_pk(media_pk)
shortcode = InstagramIdCodec.encode(media_pk)
"""Use Client.media_info
Expand All @@ -69,7 +69,7 @@ def media_info_a1(self, media_pk: int, max_id=None) -> dict:
raise MediaNotFound(media_pk=media_pk, **data)
return extract_media_gql(data["shortcode_media"])

def media_info_gql(self, media_pk: int) -> dict:
def media_info_gql(self, media_pk: int) -> Media:
media_pk = self.media_pk(media_pk)
shortcode = InstagramIdCodec.encode(media_pk)
"""Use Client.media_info
Expand All @@ -89,10 +89,9 @@ def media_info_gql(self, media_pk: int) -> dict:
data['shortcode_media']['location'] = self.location_complete(
data['shortcode_media']['location']
)
media = extract_media_gql(data["shortcode_media"])
return media
return extract_media_gql(data["shortcode_media"])

def media_info_v1(self, media_pk: int) -> dict:
def media_info_v1(self, media_pk: int) -> Media:
try:
result = self.private_request(f"media/{media_pk}/info/")
except ClientNotFoundError as e:
Expand All @@ -103,7 +102,7 @@ def media_info_v1(self, media_pk: int) -> dict:
raise e
return extract_media_v1(result["items"].pop())

def media_info(self, media_pk: int, use_cache: bool = True) -> dict:
def media_info(self, media_pk: int, use_cache: bool = True) -> Media:
"""Return dict with media information
"""
media_pk = self.media_pk(media_pk)
Expand Down Expand Up @@ -143,31 +142,6 @@ def media_edit(
location: Location = None
) -> dict:
"""Edit caption for media
Example: https://i.instagram.com/api/v1/media/2154602296692269830_1903424587/edit_media/
Video:
{
"caption_text": "Repost",
"_csrftoken": "H8Rk6Ry2ffWcUSwWIBblVK4hHHII2RMk",
"usertags": "{\"in\":[]}",
"_uid": "8530598273",
"device_id": "android-7d8ad96cc1b71922",
"_uuid": "c642fece-8663-40d8-8ab7-112df0179e65",
"is_carousel_bumped_post": "false",
"container_module": "edit_media_info",
"feed_position": "0",
"location": "{}"
}
IGTV:
{
'igtv_ads_toggled_on': '0',
'caption_text': 'TEXT',
'_csrftoken': 'Bavik4rD52i0CvNqV1vDPNHBu4NcHQWB',
'_uid': '1903424587',
'_uuid': 'c642fece-8663-40d8-8ab7-112df0179e65',
'title': 'zr+trip,+crimea,+feb+2017.+Edit+by+@milashensky'
}
"""
assert self.user_id, "Login required"
media_id = self.media_id(media_id)
Expand Down Expand Up @@ -216,7 +190,7 @@ def media_oembed(self, url: str) -> dict:
self.private_request(f"oembed?url={url}")
)

def media_comments(self, media_id: str) -> list:
def media_comments(self, media_id: str) -> List[Comment]:
"""Get list of comments for media
"""
# TODO: to public or private
Expand All @@ -241,7 +215,7 @@ def media_comments(self, media_id: str) -> list:
raise e
return comments

def media_comment(self, media_id: str, text: str) -> int:
def media_comment(self, media_id: str, text: str) -> Comment:
"""Comment media
"""
assert self.user_id, "Login required"
Expand Down
27 changes: 14 additions & 13 deletions instagrapi/user.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import time
from typing import List, Dict
from copy import deepcopy

from .exceptions import (
Expand All @@ -14,6 +15,7 @@
extract_media_v1,
)
from .utils import json_value
from .types import User, Media
from . import config


Expand All @@ -36,12 +38,12 @@ def username_from_user_id(self, user_id: int) -> str:
user_id = int(user_id)
return self.user_info(user_id).username

def user_info_by_username_gql(self, username: str) -> dict:
def user_info_by_username_gql(self, username: str) -> User:
"""Return user object via GraphQL API
"""
return extract_user_gql(self.public_a1_request(f"/{username!s}/")["user"])

def user_info_by_username_v1(self, username: str) -> dict:
def user_info_by_username_v1(self, username: str) -> User:
"""Return user object via Private API
"""
try:
Expand All @@ -54,7 +56,7 @@ def user_info_by_username_v1(self, username: str) -> dict:
raise e
return extract_user_v1(result["user"])

def user_info_by_username(self, username: str, use_cache: bool = True) -> dict:
def user_info_by_username(self, username: str, use_cache: bool = True) -> User:
"""Get user info by username
Result as in self.user_info()
"""
Expand All @@ -69,7 +71,7 @@ def user_info_by_username(self, username: str, use_cache: bool = True) -> dict:
self._usernames_cache[user.username] = user.pk
return self.user_info(self._usernames_cache[username])

def user_info_gql(self, user_id: int) -> dict:
def user_info_gql(self, user_id: int) -> User:
"""Return user object via GraphQL API
"""
user_id = int(user_id)
Expand All @@ -84,7 +86,7 @@ def user_info_gql(self, user_id: int) -> dict:
raise UserNotFound(user_id=user_id, **data)
return self.user_info_by_username_gql(data["user"]["reel"]["user"]["username"])

def user_info_v1(self, user_id: int) -> dict:
def user_info_v1(self, user_id: int) -> User:
"""Return user object via Private API
"""
user_id = int(user_id)
Expand All @@ -98,7 +100,7 @@ def user_info_v1(self, user_id: int) -> dict:
raise e
return extract_user_v1(result["user"])

def user_info(self, user_id: int, use_cache: bool = True) -> list:
def user_info(self, user_id: int, use_cache: bool = True) -> User:
"""Get user info by user_id
"""
user_id = int(user_id)
Expand Down Expand Up @@ -175,7 +177,7 @@ def user_following_v1(self, user_id: int, amount: int = 0) -> list:
users = users[:amount]
return users

def user_following(self, user_id: int, use_cache: bool = True, amount: int = 0) -> dict:
def user_following(self, user_id: int, use_cache: bool = True, amount: int = 0) -> Dict[int: User]:
"""Return dict {user_id: user} of following users
"""
user_id = int(user_id)
Expand Down Expand Up @@ -211,7 +213,7 @@ def user_followers_v1(self, user_id: int, amount: int = 0) -> list:
break
return users

def user_followers(self, user_id: int, use_cache: bool = True, amount: int = 0) -> dict:
def user_followers(self, user_id: int, use_cache: bool = True, amount: int = 0) -> Dict[int: User]:
"""Return dict {user_id: user} of followers users
"""
user_id = int(user_id)
Expand Down Expand Up @@ -247,7 +249,7 @@ def user_unfollow(self, user_id: int) -> bool:
self._users_following[self.user_id].pop(user_id, None)
return result["friendship_status"]["following"] is False

def user_medias_gql(self, user_id: int, amount: int = 50, sleep: int = 2) -> list:
def user_medias_gql(self, user_id: int, amount: int = 50, sleep: int = 2) -> List[Media]:
"""
!Use Client.user_medias instead!
Return list with media of instagram profile by user id using graphql
Expand Down Expand Up @@ -287,7 +289,7 @@ def user_medias_gql(self, user_id: int, amount: int = 50, sleep: int = 2) -> lis
time.sleep(sleep)
return [extract_media_gql(media) for media in medias[:amount]]

def user_medias_v1(self, user_id: int, amount: int = 18) -> list:
def user_medias_v1(self, user_id: int, amount: int = 18) -> List[Media]:
"""Get all medias by user_id via Private API
:user_id: User ID
:amount: By default instagram return 18 items by each request
Expand Down Expand Up @@ -319,15 +321,14 @@ def user_medias_v1(self, user_id: int, amount: int = 18) -> list:
next_max_id = self.last_json.get("next_max_id", "")
return [extract_media_v1(media) for media in medias[:amount]]

def user_medias(self, user_id: int, amount: int = 50) -> list:
def user_medias(self, user_id: int, amount: int = 50) -> List[Media]:
"""Get all medias by user_id
First, through the Public API, then through the Private API
"""
amount = int(amount)
user_id = int(user_id)
try:
medias = self.user_medias_gql(
user_id, amount) # get first 50 medias
medias = self.user_medias_gql(user_id, amount)
except Exception as e:
if not isinstance(e, ClientError):
self.logger.exception(e)
Expand Down

0 comments on commit afb1c55

Please sign in to comment.