KoSend 프로젝트인 KoSend는 안드로이드 휴대전화에서 탈옥한 Kindle의 KOReader로 EPUB·PDF·MOBI 파일을 와이파이로 보내는 앱이다. Kindle에 별도 프로그램을 설치할 필요 없이, KOReader에 포함된 무선 클라이언트를 사용한다.

휴대전화에서 책을 대기열에 추가하고 Kindle에서 연결을 누르면 전송된다. PC나 USB 케이블, calibre 라이브러리는 필요하지 않다. 모든 데이터는 로컬 네트워크 안에서만 오가며 계정·클라우드·추적 기능은 없다. 서버는 KoSend를 열고 켜 둔 동안에만 실행된다.

KoSend는 Kindle에서 한 번 누르면 KOReader가 네트워크에서 휴대전화를 자동으로 찾도록 한다. 파일은 대기열에 넣어 두었다가 Kindle이 다음에 연결될 때 전송할 수 있다. Kindle이 연결된 동안 추가한 책은 바로 전송된다. 브라우저 다운로드, 파일 관리자, 텔레그램, 이메일 등 다른 앱에서 파일을 공유해 KoSend를 선택할 수도 있다. EPUB의 제목과 저자 정보를 읽어 KOReader의 calibre 검색에서 책이 제대로 표시되도록 한다. 밝은 테마와 어두운 테마, 영어와 이탈리아어를 지원한다.

연결과 전송

휴대전화에서 버튼을 눌러 책을 추가하거나 다른 앱에서 KoSend로 파일을 공유한다. 스위치로 서버를 켜고 KoSend를 열어 둔다.

Kindle에서 KOReader를 열고 화면 위쪽 가장자리를 눌러 메뉴를 표시한다. 렌치 탭인 Tools를 열고 Calibre를 선택한 뒤 Connect를 누른다. 처음 연결할 때는 책을 저장할 폴더를 선택하라는 메시지가 표시된다. 이후 KOReader가 휴대전화를 자동으로 찾아 대기열의 책을 차례로 보낸다.

연결을 끊으려면 Kindle에서 같은 메뉴를 다시 열고 Disconnect를 누른다. KoSend에서 Disconnect Kindle을 눌러도 된다.

대기열 화면, Kindle 대기 화면, 전송 화면, 빈 대기열 화면, 어두운 테마 화면, 설정 화면을 확인할 수 있다.

요구 사항과 설치

안드로이드 8.0 이상을 실행하는 휴대전화, KOReader가 설치된 Kindle, 그리고 같은 와이파이 네트워크에 연결된 두 기기가 필요하다. calibre 플러그인은 KOReader에 포함돼 있다.

Releases 페이지에서 최신 APK를 내려받아 휴대전화에서 열면 된다. 안드로이드는 해당 출처의 앱 설치를 허용할지 묻는다. 직접 빌드하려면 빌드 안내를 참고하면 된다.

릴리스 APK는 다음 SHA-256 인증서로 서명돼 있다.

FD:FB:D8:E0:1C:8A:08:E5:F5:09:E3:7E:8F:5A:CA:CE:A4:D8:B1:C6:0E:09:9B:F0:E0:B3:D4:B3:A1:7A:B6:10

다음 명령으로 인증서를 확인할 수 있다.

text
apksigner verify --print-certs KoSend.apk

문제 해결과 제약

Kindle이 휴대전화를 찾지 못하는 경우, 게스트 네트워크나 메시 시스템, 또는 ‘client isolation’이나 ‘AP isolation’을 사용하는 라우터가 KOReader가 calibre를 찾을 때 쓰는 브로드캐스트를 차단할 수 있다. 이때는 자동 검색을 건너뛰고 KOReader의 렌치 탭에서 Calibre, Wireless settings를 연 다음 Server address를 Manual로 설정한다. KoSend 기본 화면에 표시되는 IP 주소와 포트를 입력하면 된다.

책이 “KOReader doesn't accept .azw3 files”라는 메시지와 함께 거부될 수 있다. KOReader는 Kindle의 KF8 형식을 열 수 없으므로, 먼저 EPUB으로 변환해야 한다.

앱을 떠나면 전송이 멈춘다. 서버가 KoSend가 전면에 표시된 동안에만 실행되는 방식이기 때문이다. 전송을 마치지 못한 책은 대기열로 돌아가며 다음 연결 때 전송된다.

프로토콜과 프로젝트 범위

KOReader에는 calibre 무선 기기 연결용 클라이언트가 포함돼 있다. KoSend는 그 프로토콜 가운데 KOReader에 필요한 서버 측 기능을 구현한다. 동작은 다음과 같다.

  • 검색: KOReader가 calibre의 포트 54982, 48123, 39001, 44044, 59678로 UDP hello를 브로드캐스트한다. KoSend는 자신이 수신 대기 중인 TCP 포트를 응답한다.
  • 핸드셰이크: 메시지는 바이트 길이를 앞에 붙인 JSON 배열 형식인 <length>[opcode, {payload}]로 전달된다. KoSend는 GET_INITIALIZATION_INFO, GET_DEVICE_INFORMATION, SET_CALIBRE_DEVICE_INFO, FREE_SPACE, SET_LIBRARY_INFO, GET_BOOK_COUNT를 보낸다.
  • 전송: 책마다 파일 이름과 메타데이터를 담은 SEND_BOOK을 보낸다. KOReader가 OK 또는 ERROR로 응답한 뒤 원본 파일이 전송된다. 이후 NOOP 메시지로 KOReader가 파일 쓰기를 마쳤는지 확인한다.

KoSend는 calibre를 대체하지 않는다. 라이브러리를 제공하거나 메타데이터를 편집하거나 형식을 변환하지 않으며, Kindle에서 책을 다시 가져오지도 않는다. 휴대전화에서 KOReader로 파일을 보내는 한 가지 기능에 집중한다.

참조 구현은 KOReader 자체 클라이언트인 plugins/calibre.koplugin/wireless.lua다.

직접 빌드

빌드에는 JDK 17과 Android SDK(platform 35, build-tools 35)가 필요하다. local.properties에 SDK 경로를 입력한다.

text
sdk.dir=/home/you/android-sdk

그다음 다음 명령을 실행한다.

text
./build.sh # release APK in dist/
./build.sh debug # debug APK, faster

릴리스 빌드는 저장소에 포함되지 않은 keystore.properties에 설명된 키로 서명한다. 키가 없으면 디버그 키를 사용한다.

text
storeFile=release.jks
storePassword=...
keyAlias=kosend
keyPassword=...

README의 스크린샷은 다음 명령으로 다시 생성할 수 있다.

text
./gradlew screenshots

스크린샷은 기기나 에뮬레이터 없이 JVM에서 앱 레이아웃을 렌더링하며, Paparazzi를 사용한다. 화면과 샘플 데이터는 app/src/test/java/dev/kosend/ReadmeScreenshots.kt에 정의돼 있다.

프로젝트 파일 구성은 다음과 같다.

text
app/src/main/java/dev/kosend/   CalibreServer.kt     the protocol: discovery, handshake, transfers   ServerController.kt  starts and stops the server   KoSendApp.kt         stops the server when the app goes to the background   BookStore.kt         the queue, saved on the phone   BookMeta.kt          title and author from EPUB files   MainActivity.kt      main screen and file import   QueueAdapter.kt      status card, help box and book list   SettingsActivity.kt  language and version design/                logo and README artwork (VectorCraft sources) docs/                  images used by this README

기여와 라이선스

버그 신고, 번역, 풀 리퀘스트를 받는다. 자세한 내용은 CONTRIBUTING.md를 참고하면 된다.

KoSend는 GNU General Public License v3.0에 따라 배포되는 자유 소프트웨어다. 누구나 사용·연구·공유·수정할 수 있으며, 수정본을 배포할 때는 같은 라이선스를 유지해야 한다. 라이선스 전문은 저장소의 LICENSE 파일에서 볼 수 있다.

이 프로젝트는 KOReader 팀의 작업과 calibre가 설계한 무선 기기 프로토콜을 바탕으로 만들었다. 아이콘은 Material Symbols에서 가져왔다. KoSend는 독립 프로젝트로, 아마존·calibre·KOReader와 제휴 관계가 없다. Kindle은 Amazon.com, Inc.의 상표다.