diff --git a/chzzk/__init__.py b/chzzk/__init__.py deleted file mode 100644 index dd60252..0000000 --- a/chzzk/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from chzzk.chzzk import Chzzk -from chzzk.client import Credential - -__version__ = "0.0.3" diff --git a/python_chzzk/__init__.py b/python_chzzk/__init__.py new file mode 100644 index 0000000..f1b3617 --- /dev/null +++ b/python_chzzk/__init__.py @@ -0,0 +1,4 @@ +from python_chzzk.chzzk import Chzzk +from python_chzzk.client import Credential + +__version__ = "0.0.4" diff --git a/chzzk/chzzk.py b/python_chzzk/chzzk.py similarity index 96% rename from chzzk/chzzk.py rename to python_chzzk/chzzk.py index 6fb80db..658a42e 100644 --- a/chzzk/chzzk.py +++ b/python_chzzk/chzzk.py @@ -1,7 +1,7 @@ from typing import Optional -from chzzk.client import ChzzkClient, Credential, GameClient -from chzzk.models import ( +from python_chzzk.client import ChzzkClient, Credential, GameClient +from python_chzzk.models import ( Channel, ChannelSearchRecord, LiveDetail, diff --git a/chzzk/client.py b/python_chzzk/client.py similarity index 93% rename from chzzk/client.py rename to python_chzzk/client.py index 363b1aa..fc57d0b 100644 --- a/chzzk/client.py +++ b/python_chzzk/client.py @@ -4,7 +4,7 @@ import httpx -from chzzk.errors import ChzzkHTTPError +from python_chzzk.errors import ChzzkHTTPError @dataclass @@ -27,6 +27,9 @@ def __init__(self, credential: Optional[Credential] = None): self._credential = credential self._client = httpx.AsyncClient() + self._headers = { + "user-agent": "Chrome/123.0.0.0", + } if self._credential is not None: self._client.cookies.update(self._credential.as_cookie()) @@ -43,6 +46,7 @@ async def request( response = await self._client.request( method=method, url=urljoin(self.BASE_URL, url), + headers=self._headers, params=params, data=data, **kwargs, diff --git a/chzzk/errors.py b/python_chzzk/errors.py similarity index 100% rename from chzzk/errors.py rename to python_chzzk/errors.py diff --git a/chzzk/models.py b/python_chzzk/models.py similarity index 87% rename from chzzk/models.py rename to python_chzzk/models.py index 7b98d56..145395a 100644 --- a/chzzk/models.py +++ b/python_chzzk/models.py @@ -6,7 +6,7 @@ from pydantic import AfterValidator, BaseModel, ConfigDict, Field, Json from pydantic.alias_generators import to_camel -from chzzk.utils import as_kst, to_kst +from python_chzzk.utils import as_kst, to_kst T = TypeVar("T", bound="SearchRecord") @@ -42,12 +42,19 @@ class PersonalData(RawModel): following: Optional[Following] = None +class SubscriptionPaymentAvailability(RawModel): + iap_availability: bool + iab_availability: bool + + class PartialChannel(RawModel): channel_id: Optional[str] = None channel_name: str channel_image_url: Optional[str] = None verified_mark: bool personal_data: Optional[PersonalData] = None + subscription_availability: Optional[bool] = None + subscription_payment_availability: Optional[SubscriptionPaymentAvailability] = None class Channel(PartialChannel): @@ -78,6 +85,12 @@ class LiveStatus(RawModel): live_category_value: str live_polling_status: Json[LivePollingStatus] = Field(alias="livePollingStatusJson") fault_status: Any + user_adult_status: Optional[str] + chat_active: bool + chat_available_group: str + chat_available_condition: str + min_follower_minute: int + chat_donation_ranking_exposure: bool class LivePlaybackMetaCDNInfo(RawModel): @@ -91,7 +104,8 @@ class LivePlaybackMeta(RawModel): live_id: str paid_live: bool cdn_info: LivePlaybackMetaCDNInfo - p2p: bool = Field(alias="p2p") + # p2p: bool = Field(alias="p2p") + cmcd_enabled: bool class LivePlaybackServiceMeta(RawModel): @@ -163,12 +177,13 @@ class LivePlayback(RawModel): class Live(RawModel): live_title: str - live_image_url: str + live_image_url: Optional[str] default_thumbnail_image_url: Optional[str] = None concurrent_user_count: int accumulate_count: int open_date: Annotated[datetime, AfterValidator(to_kst)] live_id: int + adult: bool chat_channel_id: str category_type: Optional[str] = None live_category: Optional[str] = None @@ -187,6 +202,9 @@ class LiveDetail(Live): min_follower_minute: int channel: PartialChannel live_polling_status: Json[LivePollingStatus] = Field(alias="livePollingStatusJson") + p2p_quality: list[Any] = Field(alias="p2pQuality") + user_adult_status: Optional[str] + chat_donation_ranking_exposure: bool class VideoMetadata(RawModel): @@ -200,6 +218,7 @@ class VideoMetadata(RawModel): read_count: int channel_id: Optional[str] = None publish_date_at: Annotated[datetime, AfterValidator(as_kst)] + adult: bool category_type: Optional[str] = None video_category: str video_category_value: str @@ -208,6 +227,7 @@ class VideoMetadata(RawModel): class PartialVideo(VideoMetadata): trailer_url: Optional[str] = None exposure: bool + video_category: Optional[str] channel: PartialChannel @@ -216,6 +236,7 @@ class Video(PartialVideo): in_key: str live_open_date: Annotated[datetime, AfterValidator(to_kst)] vod_status: str + user_adult_status: Optional[str] prev_video: Optional[PartialVideo] = None next_video: Optional[PartialVideo] = None diff --git a/chzzk/utils.py b/python_chzzk/utils.py similarity index 100% rename from chzzk/utils.py rename to python_chzzk/utils.py diff --git a/run.py b/run.py index e7fdd91..77628a5 100644 --- a/run.py +++ b/run.py @@ -1,19 +1,32 @@ import asyncio -from chzzk import Chzzk -from chzzk.client import Credential +from python_chzzk import Chzzk +from python_chzzk.client import Credential async def main(): - chzzk = Chzzk( - Credential( - nid_auth="w3kvHDBy7+B/rvaPGcvusyp3IvunbtJWQIfZOAX1mSvisgMNBUg6vo320DGmUqSw", - nid_session="AAABqzuRWjsdfaZDf66Ms4LhTZnbF7spL+AJqDKrZK4KAe/BtW81A/3Dyhi2TXQTh91uRVwpp4HcK5GWOY9ALLA70RDoLZOfetD9TZA0yTHL1Bkj9H+/M5INXHY7IdWgWrNiqa2MFovzrhPmCQc6/i4dbUp8grnYgt+JlWnWTQajxqvkYfnTqbsdnHYRtjCrCGJvkAT15jk/x6kOWQwFo14WHV8noduFR+xHciawMFF4uwnheKiQxTWrUNadVXjivwMp/ofsCKr9C2BNrLmPhuRpJ0O103HKiVn1TlWj95u2sUvWIED2ivpRLR7yAUKaxGzbeWe6n3GuRkL24B43mRWQ9KVKdURIGzbuBNeVkBuXj+OoWEhCWrySD18bVyaiIKcV3o603rh16Mde3ceOFk69Q/ZGiO5GTovbUyUH1B3EOhwbUD3qzV18n3AuoPWEIsSfD/MjCwl8UHA78IbM6l9BdeMETvlkT/rCJsOi7bdENzNPVdSmH+6YrYrZ6g6eJZnZZZ76iIUCAbuzQg5+u3c824lXTi3RbIPlZtYX9RdZmdu/On9TfAILALnuxamlMrRbTA==", - ) + credential = Credential( + auth="w3kvHDBy7+B/rvaPGcvusyp3IvunbtJWQIfZOAX1mSvisgMNBUg6vo320DGmUqSw", + session="AAABqzuRWjsdfaZDf66Ms4LhTZnbF7spL+AJqDKrZK4KAe/BtW81A/3Dyhi2TXQTh91uRVwpp4HcK5GWOY9ALLA70RDoLZOfetD9TZA0yTHL1Bkj9H+/M5INXHY7IdWgWrNiqa2MFovzrhPmCQc6/i4dbUp8grnYgt+JlWnWTQajxqvkYfnTqbsdnHYRtjCrCGJvkAT15jk/x6kOWQwFo14WHV8noduFR+xHciawMFF4uwnheKiQxTWrUNadVXjivwMp/ofsCKr9C2BNrLmPhuRpJ0O103HKiVn1TlWj95u2sUvWIED2ivpRLR7yAUKaxGzbeWe6n3GuRkL24B43mRWQ9KVKdURIGzbuBNeVkBuXj+OoWEhCWrySD18bVyaiIKcV3o603rh16Mde3ceOFk69Q/ZGiO5GTovbUyUH1B3EOhwbUD3qzV18n3AuoPWEIsSfD/MjCwl8UHA78IbM6l9BdeMETvlkT/rCJsOi7bdENzNPVdSmH+6YrYrZ6g6eJZnZZZ76iIUCAbuzQg5+u3c824lXTi3RbIPlZtYX9RdZmdu/On9TfAILALnuxamlMrRbTA==", ) + chzzk = Chzzk(credential) + print("me:") print(await chzzk.me()) - print(await chzzk.channel("bb382c2c0cc9fa7c86ab3b037fb5799c")) + print("channel:") + print(await chzzk.channel("bdc57cc4217173f0e89f63fba2f1c6e5")) + print("video:") + print(await chzzk.video(1794)) + print("search channels:") + print(await chzzk.search.channels("풍월량")) + print("search videos:") + print(await chzzk.search.videos("자낳대")) + print("search lives:") + print(await chzzk.search.lives("타르코프")) + print("live status:") + print(await chzzk.live.status(channel_id="22bd842599735ae19e454983280f611e")) + print("live detail:") + print(await chzzk.live.detail(channel_id="22bd842599735ae19e454983280f611e")) if __name__ == "__main__": diff --git a/setup.cfg b/setup.cfg index 347c40c..644580a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = python-chzzk -version = attr: chzzk.__version__ +version = attr: python_chzzk.__version__ description = An unofficial Python library for CHZZK author = Jonghwan Hyeon author_email = jonghwanhyeon93@gmail.com @@ -22,4 +22,4 @@ install_requires = pydantic typing-extensions python_requires = >=3.8 -packages = find: \ No newline at end of file +packages = find: