02
02

개요

AlphaSlayer1964/kemono-dl

kemono.su / coomer.su 에서 쉽게 일괄 다운로드를 할 수 있게 해 주는 파이썬 프로젝트이다.

예전에 로컬에 Clone해서 사용하고 있었던 이게 오랫만에 쓰려고 보니 작동하지 않아, 여러번의 시행착오를 거쳐 잘 작동하도록 수정하였다.

해당 깃허브 리파지토리의 Issues 목록을 확인 해 보니 역시 관련된 문제를 제기하는 유저들이 많았다.

해결한 내용을 혼자만 알고 있기 아까워 처음으로 다른 개발자의 프로젝트를 손대보았다.

사실 '오픈소스 프로젝트에 참여한다'는 게 어떤 행동까지 포함되는지 잘 알지 못하는데, 해당 프로젝트의 원래 개발자가 이 프로젝트를 public으로 던져두고 2년간 잠적한 상태라서 외부 개발자의 PR이 10개 가까이 쌓여있고, 마찬가지로 내가 수정한 코드가 반영 될 일은 없을 것 같다. 이걸 오픈소스 프로젝트라고 할 수 있을지는 잘 모르겠다.

그래도 PR을 올려두면 다른 유저들도 수정사항을 조회 할 수 있기 때문에 의미없는 행동은 아닐 것이라고 생각한다.

프로젝트 참여 과정

해당 리포지토리의 우측 상단에서 Fork 기능을 사용하여 나의 리포지토리 목록에 해당 프로젝트를 복사 해 온다.

정상적으로 Fork하였다면, 아래와 같이 새로운 리포지토리가 생성되어있고, forked from ... 의 메시지도 확인 할 수 있다.

새로 생긴 리포지토리를 로컬에 Clone 하여 샥샥 수정 후 Commit과 Push를 하면 내 깃허브 리포지토리에 반영이 되는데

내 리포지토리에서 Pull requests를 누르면 위와 같이 Fork했던 기존 프로젝트에 Pull Request를 할 수 있다.

PR 메시지를 작성 후 올려두면, 아래와 같이 기존 프로젝트의 Pull Requests 목록에 올려진 것을 확인 할 수 있다.

문제가 되었던 내용

  1. Kemono와 Coomer의 도메인 변경
  2. Kemono와 Coomer의 API 주소 변경
  3. Datetime - API 서버에서 반환되는 날짜 및 시간 문자열의 형식이 ISO 8601로 조정됨
  4. Datetime - 정수 및 문자열 데이터 타입의 혼동. 일부 데이터의 전달이 문자열(str) 타입에서 정수(int) 타입으로 바뀜

Kemono와 Coomer의 도메인 변경

두 서비스의 도메인이 kemono.party 와 coomer.party 에서 kemono.su 와 coomer.su 로 바뀌었다.

세개 정도 소스코드에서 '.party'를 '.su' 문자열로 모두 찾아바꾸는 것으로 해결하였는데, 이 부분은 운좋게 해결 된 감이 없지않다.

Kemono와 Coomer의 API 주소 변경

기존에 요청을 보내던 API 주소가 제대로 응답을 주지 않았다. 설마 요청할 API의 주소가 바뀌었을 것이라고는 예상하기 어려울 것 같다.

브라우저 창에서 기존에 요청하던 주소인 https://coomer.su/api/creators/ 에 접속 해 보아도 Not Found 를 받아오는 것을 보고 해당 주소의 파일구조를 확인 해 봐야겠다고 생각했다.

루트 경로인 coomer.su 에서 개발자 도구를 통해 api로 향하는 파일구조를 확인할 수 있을 줄 알았지만, 찾아보니 이러한 방법으로는 구조를 확인 할 수 없다고 한다. coomer에서 api의 가이드를 해 주지 않는다면 알아내는 것은 어렵다고 한다.

구글 검색을 하던 중, coomer가 제공하는 API 가이드를 발견하였다. 정말 기대조차 못했던 수확이다.

확인 해 보니 아무래도 coomer는 API의 개선을 진행하고 있는 듯 하다. 기존 사용하던 API는 주소 뒤에 /v1라는 경로가 추가되어 있는 것을 확인했다.

즉 소스코드에 쓰이고 있던 경로 문자열에서 .../api/....../api/v1/...로 바꿔주면 되었고, 모든 경로를 찾아 바꿔 해결 할 수 있었다.

Datetime 관련 문제

날짜에 관련된 문자열 처리 과정에서 문제가 있었다. 갈피를 잡지 못해 ChatGPT에게 소스코드를 보여주며 원인을 찾아보도록 하였는데, GPT는 API에 직접 접근하지 못하기 때문에 방향을 제시 해 주는 정도였다.

입력으로 주는 날짜 정보 등을 출력해가며 이를 함께 제시 해 주니, 원인을 찾을 수 있었다.

날짜 및 시간 형식의 불일치: API 서버의 주소 변경으로 인해 반환되는 날짜 및 시간 문자열의 형식이 ISO 8601로 조정되었습니다. 기존 코드는 특정 형식(예: %a, %d %b %Y %H:%M:%S %Z)을 기대했으나, API의 조정으로 인해 이 형식이 변경되었고, 이로 인해 기존의 datetime.strptime 함수로는 새로운 형식의 날짜 및 시간 문자열을 올바르게 파싱할 수 없게 되었습니다.

즉 예전과는 다른 날짜형식을 API가 반환하고 있기 때문에 파싱 과정에서 문제가 되었다는 내용.

coomer의 입장에서 보면 standard에 가까운 형식으로 반환하도록 수정한 것이기 때문에 방향성으로는 올바른 것 같다.

그래서 문제가 된 것은, datetime.strptime함수로 새로운 형식의 날짜 및 시간 문자열을 올바르게 파싱할 수 없게 된 것이다.

ISO 8601 형식에 대응 할 수 있도록 새로운 함수 parse_date_string를 마련하였다. 해당 함수는 여러 날짜 형식을 시도하고, 올바르게 파싱할 수 있는 형식을 찾으면 해당 형식으로 날짜 및 시간 문자열을 처리한다.

또한, 문자열 타입(str)의 인자를 전달해야 하는 곳에 정수형 변수(int)가 전달되는 문제도 생겨, 필요한 경우 문자열로 변환하는 로직을 추가하였다.

(위 작성한 내용의 절반 이상이 날아가 다시 작성함.. ㅠㅠ)

Pull Request

모든 것을 마치고 아래와 같이 PR을 작성하였다.

다른 개발자의 프로젝트에 리퀘스트를 넣어보는 것은 처음이기도 하고 열심히 작성 해 보았다.

반응형
COMMENT