Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions chzzk/__init__.py

This file was deleted.

4 changes: 4 additions & 0 deletions python_chzzk/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from python_chzzk.chzzk import Chzzk
from python_chzzk.client import Credential

__version__ = "0.0.4"
4 changes: 2 additions & 2 deletions chzzk/chzzk.py → python_chzzk/chzzk.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
6 changes: 5 additions & 1 deletion chzzk/client.py → python_chzzk/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import httpx

from chzzk.errors import ChzzkHTTPError
from python_chzzk.errors import ChzzkHTTPError


@dataclass
Expand All @@ -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())
Expand All @@ -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,
Expand Down
File renamed without changes.
27 changes: 24 additions & 3 deletions chzzk/models.py → python_chzzk/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand Down Expand Up @@ -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
Expand All @@ -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):
Expand All @@ -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
Expand All @@ -208,6 +227,7 @@ class VideoMetadata(RawModel):
class PartialVideo(VideoMetadata):
trailer_url: Optional[str] = None
exposure: bool
video_category: Optional[str]
channel: PartialChannel


Expand All @@ -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
Expand Down
File renamed without changes.
29 changes: 21 additions & 8 deletions run.py
Original file line number Diff line number Diff line change
@@ -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__":
Expand Down
4 changes: 2 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -22,4 +22,4 @@ install_requires =
pydantic
typing-extensions
python_requires = >=3.8
packages = find:
packages = find: