# -*- coding: utf-8 -*-
"""시그널 스티커다운로더.ipynb

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1r-E2RfcECj5pb3O0YxsYIItHR31Ol9aA

# **Signal 스티커 다운로더**
"""

import os, glob, shutil
from google.colab import files

# URL 입력받기
PACK_URL = input("Signal 스티커팩 URL을 입력하세요: ").strip()

if not PACK_URL:
    raise Exception("URL이 입력되지 않았습니다.")

# URL 형식 보정
PACK_URL = PACK_URL.replace("addstickers#", "addstickers/#")

print("사용할 URL:", PACK_URL)

# 기존 downloads 폴더가 있으면 삭제
if os.path.exists("downloads"):
    shutil.rmtree("downloads")

# 다운로드
!python -m sigstickers --pack "$PACK_URL"

# 다운로드된 팩 찾기
packs = glob.glob("downloads/*")
print("찾은 팩:", packs)

if not packs:
    raise Exception("다운로드된 스티커팩 폴더가 없습니다.")

pack_dir = packs[0]

# WebP 원본/기본 형식 폴더 선택
# `pack_dir`이 이미 `downloads/webp`를 가리키므로, 중첩된 `webp` 폴더를 다시 만들 필요가 없습니다.
webp_dir = pack_dir

if not os.path.exists(webp_dir):
    print("팩 폴더 구조:")
    for root, dirs, files_list in os.walk(pack_dir):
        print(root, dirs, files_list[:5])
    raise Exception("webp 폴더가 없습니다. 다운로드 결과 폴더 구조를 확인하세요.")

# 압축
zip_path = shutil.make_archive("signal_stickers_original_webp", "zip", webp_dir)

# 다운로드
files.download(zip_path)

"""# **dc콘 다운로더**"""

!pip install -q requests lxml tqdm

import os
import re
import shutil
import mimetypes
import requests
from tqdm import tqdm
from google.colab import files

BASE_URL = "https://dccon.dcinside.com"
PACKAGE_API = "https://dccon.dcinside.com/index/package_detail"
IMAGE_API = "https://dcimg5.dcinside.com/dccon.php"

session = requests.Session()

COMMON_HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Referer": BASE_URL + "/",
}

AJAX_HEADERS = {
    **COMMON_HEADERS,
    "X-Requested-With": "XMLHttpRequest",
}


def clean_filename(name):
    name = str(name)
    name = re.sub(r'[\\/:*?"<>|]', "_", name)
    name = name.strip()
    return name if name else "dccon"


def extract_package_idx(text):
    """
    입력값에서 package_idx 추출
    가능 입력:
    - 123456 같은 숫자
    - https://dccon.dcinside.com/.../123456
    - package_idx=123456 포함 URL
    """
    text = text.strip()

    if text.isdigit():
        return text

    patterns = [
        r"package_idx=(\d+)",
        r"/(\d+)(?:\D*)?$",
        r"dccon\.dcinside\.com/.+?/(\d+)",
    ]

    for pattern in patterns:
        m = re.search(pattern, text)
        if m:
            return m.group(1)

    raise ValueError("package_idx를 찾지 못했습니다. 디시콘 상세 URL 또는 숫자 ID를 넣어주세요.")


def get_ci_t():
    """
    디시콘 package_detail 요청에 필요한 ci_t 값 획득
    """
    r = session.get(PACKAGE_API, headers=AJAX_HEADERS, timeout=15)
    return r.cookies.get("ci_c", "")


def get_package_data(package_idx):
    ci_t = get_ci_t()

    data = {
        "ci_t": ci_t,
        "package_idx": package_idx,
    }

    r = session.post(
        PACKAGE_API,
        headers=AJAX_HEADERS,
        data=data,
        timeout=20,
    )

    if r.status_code != 200:
        raise Exception(f"package_detail 요청 실패: HTTP {r.status_code}")

    try:
        pkg_data = r.json()
    except Exception:
        print(r.text[:500])
        raise Exception("JSON 응답을 읽지 못했습니다. 사이트 구조가 바뀌었거나 차단되었을 수 있습니다.")

    if not isinstance(pkg_data, dict):
        raise Exception("예상과 다른 응답 형식입니다.")

    if "detail" not in pkg_data:
        print(pkg_data)
        raise Exception("detail 정보가 없습니다. package_idx가 잘못됐거나 비공개/삭제된 디시콘일 수 있습니다.")

    return pkg_data


def guess_ext(response, default_ext):
    default_ext = (default_ext or "").lower().replace(".", "")

    if default_ext in ["jpg", "jpeg", "png", "gif", "webp"]:
        return "jpg" if default_ext == "jpeg" else default_ext

    content_type = response.headers.get("Content-Type", "").split(";")[0].strip()
    ext = mimetypes.guess_extension(content_type)

    if ext:
        return ext.replace(".", "").replace("jpeg", "jpg")

    return "png"


def download_dccon(package_idx, output_root="dccon_downloads"):
    pkg_data = get_package_data(package_idx)

    info = pkg_data.get("info", {})
    detail = pkg_data.get("detail", [])

    title = clean_filename(info.get("title", f"dccon_{package_idx}"))
    output_dir = os.path.join(output_root, title)

    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)

    os.makedirs(output_dir, exist_ok=True)

    print(f"디시콘명: {title}")
    print(f"이미지 개수: {len(detail)}")

    if not detail:
        raise Exception("다운로드할 이미지가 없습니다.")

    for i, item in enumerate(tqdm(detail, desc="다운로드 중"), start=1):
        img_path = item.get("path")
        if not img_path:
            continue

        img_idx = item.get("idx", i)
        alt = item.get("title") or item.get("alt") or item.get("name") or ""
        ext_hint = item.get("ext", "png")

        r = session.get(
            IMAGE_API,
            headers=COMMON_HEADERS,
            params={"no": img_path},
            timeout=30,
        )

        if r.status_code != 200 or not r.content:
            print(f"실패: {i}번 이미지 / HTTP {r.status_code}")
            continue

        ext = guess_ext(r, ext_hint)

        alt_part = clean_filename(alt)
        if alt_part and alt_part != "dccon":
            filename = f"{i:03d}_{img_idx}_{alt_part}.{ext}"
        else:
            filename = f"{i:03d}_{img_idx}.{ext}"

        file_path = os.path.join(output_dir, filename)

        with open(file_path, "wb") as f:
            f.write(r.content)

    zip_path = shutil.make_archive(title, "zip", output_dir)
    print("압축 완료:", zip_path)

    return zip_path


# 실행 부분
user_input = input("디시콘 URL 또는 package_idx를 입력하세요: ").strip()

package_idx = extract_package_idx(user_input)
print("package_idx:", package_idx)

zip_path = download_dccon(package_idx)

files.download(zip_path)