안녕하십니까 ?  EddyLab입니다.


오늘은 처음 제가 영상 캡춰라는 방법으로 
U5PVR 동작 동영상을 만들어서 올려 드립니다. ^^


영상 캡춰는 S50의 HDMI IN을 이용하여 캡춰를 하였습니다.

U5PVR HDMI Out ==> S50 HDMI IN 방식입니다. ^^

S50 HDMI IN 화면 캡춰는 1080P@30fps까지만 지원됩니다.

그렇기 때문에, U5PVR에서는 4K해상도로 설정을 하여도,
1080P 8bit로만 해상도가 맞춰지므로, 동영상 화질은 원본 화질과 다릅니다. ^^

아직 4K 화면캡춰장비는 고가라서 구입하기가 어려움이 있으므로,
U5PVR 동작 사항에 대한 참조를 해 주시기 바랍니다.





1. U5PVR Rebooot 170308


먼저 U5PVR리부팅을 실시 해 보았습니다.
이는 리부팅 후, 어느정도 시간이 걸리는지를 확인 하기 위함입니다. ^^



2. U5PVR Setting 170308


U5PVR리부팅 후, 런처 화면은 30초 정도 걸립니다.
이후, U5PVR의 린백런처 상단의 추천 컨텐츠가 올라오기 까지는 
약간 추가 시간이 소요됩니다. (약1분10초)

이는 린백런처의 시스템에서 불러오는 것이라서,
개발쪽에서는 막을 수 없습니다. ^^

그리고 백그라운드에서는 리눅스 동시 부팅이 실행되고 있습니다.



3. U5PVR eON TV 170308


U5PVR의 지상파/케이블(암호채널제외) 방송 시청입니다.
Test는 지상파 TV 채널을 일반 안테나와 연결하여 test하였습니다.



4. U5PVR live Channel 170308


U5PVR의 TVH와 연동하여 방송시청 가능 test를 하였습니다.



5. U5PVR LAN 4K Blu ray 170308


U5PVR의 LAN 연결 test
자체 재생기 4K 재생 및 Blu-ray ISO파일 재생 test 입니다.



16년형 LG OLED TV - U5PVR - 내장 재생기로 

도깨비 4K@60fps@10bit ts파일 재생 (재생 문제 없음)



http://cafe.naver.com/mk802/19962


저작자 표시 비영리 변경 금지
신고
U5PVR 구글 드라이브 연동하기 [rclone]



안녕하세요. 도정진입니다.


이번에는 U5PVR 리눅스에서 google 드라이브를 연동하는 방법에 대해서 알아보도록 하겠습니다.


프로그램으로 rclone 을 사용하며 드라이브 방식으로 마운트 하여 사용하는 데에는 이만한 프로그램이 없다고 생각되어 이 프로그램으로 가이드를 작성합니다. 


추가적으로 rclone 은 구글 드라이브만 지원하는 것이 아니라 아마존 무제한 클라우드 등등 많이 지원을 하고 있음으로 각 설정 방법은 아래의 구글 드라이브를 추가하는 것과 비슷합니다. 공식 홈페이지에서 참고하여 설정해 주시면 되겠습니다.



http://rclone.org/



1. rclone 설치하기


먼저 rclone 은 파일 시스템을 마운트 할 때, fuse 파일 시스템을 사용합니다. 따라서 fuse 패키지를 설치해야합니다.


추가적으로 zip 파일의 압축을 풀기 위해서 unzip 패키지도 설치합니다.


apt-get install fuse unzip


다음으로 rclone 바이너리를 홈페이지에서 받습니다.





받은 파일의 압축을 풀기 위해서 아래의 명령을 입력합니다.


# unzip rclone 입력하시고 TAB 키로 자동완성하시면 편리합니다.

unzip rclone-v1.35-linux-arm.zip

cd cd  rclone-v1.35-linux-arm


압축을 풀고 해당 폴더로 이동하셨으면 바이너리 파일을 편리하게 실행할 수 있게 PATH 환경변수에 포함된 디렉터리로 이동시킵니다. 저는 /usr/bin 에 옮기도록 하겠습니다.


cp rclone /usr/bin


# 실행 권한이 필요하기 때문에 아래의 퍼미션 설정을 합니다.

chmod a+x /usr/bin/rclone


다음으로 rclone 이 정상적으로 실행이 되는지 체크합니다.


아래처럼 뜨면 정상적으로 설치가 된 상태입니다.


root@u5pvr-debian:~# rclone version

2017/03/17 22:29:22 Config file "/root/.rclone.conf" not found - using defaults

rclone v1.35




2. 구글 드라이브 연동하기


마운트 폴더를 하나 만들기 위해서 /mnt/gdrive 라는 폴더를 만듭니다.


mkdir /mnt/gdrive


아래 명령을 통해서 구글 드라이브를 연동합니다.


root@u5pvr-debian:~# rclone config

2017/03/17 22:32:17 Config file "/root/.rclone.conf" not found - using defaults

No remotes found - make a new one

n) New remote

s) Set configuration password

q) Quit config

n/s/q> n

# 새로운 리모트를  생성해야 함으로 n 을 입력합니다.


name> djj9405

# 마음에 드는 이름을 하나 입력하십시오.


Type of storage to configure.

Choose a number from below, or type in your own value

 1 / Amazon Drive

   \ "amazon cloud drive"

 2 / Amazon S3 (also Dreamhost, Ceph, Minio)

   \ "s3"

 3 / Backblaze B2

   \ "b2"

 4 / Dropbox

   \ "dropbox"

 5 / Encrypt/Decrypt a remote

   \ "crypt"

 6 / Google Cloud Storage (this is not Google Drive)

   \ "google cloud storage"

 7 / Google Drive

   \ "drive"

 8 / Hubic

   \ "hubic"

 9 / Local Disk

   \ "local"

10 / Microsoft OneDrive

   \ "onedrive"

11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)

   \ "swift"

12 / Yandex Disk

   \ "yandex"

Storage> 7

Google Application Client Id - leave blank normally.

client_id> 

Google Application Client Secret - leave blank normally.

client_secret> 

# 정확하게 모르겠지만 보통 필요가 없습니다. 그래서 아무것도 입력하지 않고 엔터를 누릅니다.


Remote config

Use auto config?

 * Say Y if not sure

 * Say N if you are working on a remote or headless machine or Y didn't work

y) Yes

n) No

y/n> n

# 쉘에서 작업을 하기 때문에 자동 설정이 되지 않습니다. 따라서 n 을 입력하여 수동설정으로 넘어갑니다.


If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?client_id=202264815644.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=b02c34056754881ab1b1d15b4e5bf67d

Log in and authorize rclone for access

Enter verification code>

# 이부분은 구글 계정과 연동하기 위한 부분입니다. 작업하실 때 나오는 링크를 복사하시고, 미리 브라우저에서는 연결할 구글 계정으로 로그인을 해 둡니다. 그 상태에서 위 주소를 붙여넣어 코드를 받으시면 됩니다.

각기 주소가 다르기 때문에 위 주소를 복사하지 마시고 작업중인 장비에서 나온 주소를 복사하여 작업하시길 바랍니다.


저의 경우 위 주소로 이동해 보면 아래와 같이 권한 허용창이 뜹니다.


아래에 나온 코드를 복사하여 붙여 넣습니다.



If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?client_id=202264815644.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=b02c34056754881ab1b1d15b4e5bf67d

Log in and authorize rclone for access

Enter verification code> ----------------------------------------------

# 브라우저에서 복사한 코드를 붙여넣습니다.


--------------------

[djj9405]

client_id = 

client_secret = 

token = {"access_token":"---------------------------------------------------------------------------------------------------------------------------------------------------------------","token_type":"Bearer","refresh_token":"----------------------------------------------","expiry":"2017-03-17T23:39:37.623176291+09:00"}

--------------------

y) Yes this is OK

e) Edit this remote

d) Delete this remote

y/e/d> y

# 설정이 맞느냐고 물어보는데 맞으니 y 를 눌러줍니다.


Current remotes:


Name                 Type

====                 ====

djj9405              drive


e) Edit existing remote

n) New remote

d) Delete remote

s) Set configuration password

q) Quit config

e/n/d/s/q> q

# 설정이 끝났음으로 q 를 눌러서 종료해 줍니다.


root@u5pvr-debian:~# 



이렇게 구글드라이브 등록이 끝났습니다.



3. 구글 드라이브 마운트하기


아래 명령을 통해서 마운트 합니다.


# 마지막에 2번에서 설정한 공유이름: (뛰우기) 마운트할 폴더를 입력합니다.

# 데몬형식으로 도는게 아니기 때문에 사용자 쉘이 종료되어도 작동 유지를 위해서 nohup 과 & 을 사용합니다.


nohup rclone mount --allow-non-empty --allow-other --uid 1023 --gid 1028 --max-read-ahead 2G --acd-templink-threshold 0 --checkers 16 --quiet --stats 0 djj9405: /mnt/gdrive/ &


# 한편, 안드로이드 파일 권한과 맞아야함으로 어쩔 수 없이 uid 와 gid는 1023 1028 이 되어야 합니다.


위 명령어로 실행 시켜본 결과는 아래와 같습니다.


혹시나 무슨 문제가 있어서 프로그램이 강제 종료될 시에 현 작업폴더에서 nohup.out 을 참고하여 에러 내용을 확인하시길 바랍니다.


root@u5pvr-debian:~# nohup rclone mount --allow-non-empty --allow-other --uid 1023 --gid 1028 --max-read-ahead 2G --acd-templink-threshold 0 --checkers 16 --quiet --stats 0 djj9405: /mnt/gdrive/ &

[1] 29639

root@u5pvr-debian:~# nohup: ignoring input and appending output to 'nohup.out'


root@u5pvr-debian:~#


root@u5pvr-debian:/mnt/gdrive# ls

call_record  imei ??????  torrent  ????????? ??????  ???????????????  ???????????????

# 정상적으로 구글드라이브에 있는 파일이 보입니다.



(주) djj9405은 본인의 ID로 수정하셔야 합니다.



4. 구글 드라이브 마운트한 것 사용해보기


기본적으로 리눅스 펌웨어에는 FTP 가 내장되어 있습니다. SAMBA 의 경우 안드로이드 자체에 내장이 되어 있습니다. 


(삼바는 리눅스 패키지로 설치를 하지 않은 이유가 삼바는 내부망 전용이기 떄문에 안드로이드 자체 삼바로도 기능이 충분하다고 생각하기 때문입니다.)


이번에는 FTP 로 접근을 시도해 보도록 하겠습니다.



정상적으로 제 클라우드에 있는 파일들이 보입니다.



클라우드에서 FTP 를 통해 로컬로 파일을 다운받아보았습니다.


평소에 7MB/s 정도 나오는데 오늘은 약간 낮게 나오네요.



업로드도 마찬가지 입니다.



통상 사용하는 CPU 사용량은 아래와 같습니다.


4K VP9 60FPS 영상을 구글 드라이브를 /mnt/gdrive 에 마운트 하여 테스트를 해 보았는데 rclone 의 CPU 사용량이 올라가서 재생이 한번씩 끊기는 현상이 있었습니다. 이 부분은 최적화 할 수 있는 부분인지 체크를 해보고 있습니다.



안드로이드에서는 아래와 같이 사용이 가능합니다. 아쉬운점은 미디어 센터에서는 보이지 않는다는 점이네요.



ES 파일탐색기를 통해 /mnt/gdrive 로 접근하여 에이핑크 영상 재생해 보았습니다.



사진으로 보여드렸지만 재생이 매끄럽게 되다가 한번씩 멈춤현상이 있습니다.

rclone CPU 사용량 때문이네요..



다음은 Kodi 에서 사용기입니다.

코디의 경우 내장 디스크 를 선택하고 /mnt/gdirve 로 이동하면 됩니다.



아래처럼 정상적으로 파일이 보입니다. 


똑같이 에이핑크 영상을 돌려 보았습니다. (4K VP9 60FPS)



코디의 경우 초반에 버퍼링이 쬐끔 걸리지만 재생이 잘 되었습니다.




5. 부팅시 자동 마운트 하기


이 부분은 유선랜이 꼽혀있지 않은 분들은 불안정한 방법입니다.

무선랜의 경우 연결이 될때까지 딜레이가 있기 떄문에 리눅스 부팅과정 중 네트워크가 물려 있지 않으면 에러가 발생하기 떄문입니다.

그러나 유선랜의 경우에는 리눅스 부팅이 되기 전에 네트워크가 붙기 때문에 문제가 없습니다. 

(차후에 네트워크 상태를 확인하여 실행하는 스크립트를 만들어 보도록 하겠습니다.)


기본적으로 /etc/rc.local 파일을 사용하여 부팅 시 자동실행을 하게 합니다.


nano /etc/rc.local


#!/bin/sh -e

#

# rc.local

#

# This script is executed at the end of each multiuser runlevel.

# Make sure that the script will "exit 0" on success or any other

# value on error.

#

# In order to enable or disable this script just change the execution

# bits.

#

# By default this script does nothing.


# hostname 

/etc/init.d/hostname.sh start


# google drive mount

mkdir /mnt/gdrive

su root -c "nohup rclone mount --allow-non-empty --allow-other --uid 1023 --gid 1028 --max-read-ahead 10G --acd-templink-threshold 0 --che$




exit 0


테스트를 해 본 결과 정상적으로 작동하며 특이사항은 없습니다.


이 부분을 init 스크립트를 통해 rc 로 등록이 가능하도록 가이드를 찾는 중입니다.



감사합니다.



저작자 표시 비영리 변경 금지
신고


U5PVR 리눅스 펌웨어 기본 패키지 (Plex, TVheadend, FTP, Torrent)




안녕하십니까 ?  EddyLab입니다.


U5PVR 제품관련 동영상을 올려 드린 바 있습니다. 

[EddyLab] U5PVR 방송 시청 및 동영상 재생 리뷰 1
http://cafe.naver.com/mk802/19962

U5PVR 구글 드라이브 연동하기 [rclone]
http://cafe.naver.com/mk802/20173


U5PVR = Q10Pro + 지상파 케이블 방송 2튜너 (PVR) + 리눅스 지원 기능입니다..


오늘은 U5PVR에서 리눅스 지원 관련 기능을 먼저 간단히
소개해 드리도록 하겠습니다.
(U5PVR리눅스는 데스트탑 UI가 나오는 것은 아니고, 
Shell이라는 명령어로 운영할 수 있는 아주 가벼운 형태의 리눅스(데비안)이 탑제되어 있습니다.
좀 더 기술적으로 정확히 이야기 드리면, 도커(Docker)와 같은 개념으로
안드로이드의 커널을 같이 쓰는 리눅스 입니다.)


리눅스라고 무조건 어려운 것은 아닙니다. ^^


리눅스의 장점은 가벼운 OS환경에서 서버급 기능을 쉽게 구현할 수 있다는 점입니다.


이는 기존의 안드로이드 셋탑은 개인화 기기라고 표현한다면,
안드로이드 + 리눅스 셋탑은 NAS 기기라고 표현할 수 있습니다.

NAS는 댁내외 언제 어디서든지, 동시에 여러 접속자가 붙어도
동시에 여러가지 기능을 수행 할 수가 있습니다.

즉, U5PVR로 메인 TV에서 지상파 방송 시청 중에,
댁내에서 또는 외부(포트포워딩 필요)에서 다른 지상파 채널을 시청이 가능하거나,
연결된 HDD의 컨텐츠를 스트리밍으로 재생 시청이 가능하게 됩니다. 


이러한 여러가지 기능을 수행하기 위하여서
어려운 리눅스 OS 설치작업 및 서버 설정등을 단순화 하여
운영이 가능하도록 개발한 제품입니다.
(물론 기본적으로 컨텐츠, 채널 정보는 개인이 가지고 있어야 하며,
추가로 클라이언트 설정은 하셔야 합니다.) 

하기 리눅스 기능은 U5PVR에 기본적으로 설치된 내용만 소개되어 있고,
기타 다른 리눅스 서버 기능은 본인이 원하시면 설치를 하시면 운영이 가능합니다.

그만큼 확장성이 대폭 넓어진 제품임에는 분명하고,
쓰임의 용도는 유저의 레벨에 따라서 더 많은 기능을 구현하실 수 있습니다.
(물론 U5PVR의 HW퍼포먼스를 고려하여 CPU부하가 많이 걸리는 작업은
밸런스를 고려하시고 운영을 하시는 것이 좋습니다. ^^)

먼저 U5PVR의 리눅스 기본 기능을 하기 내용으로 소개 해 올립니다.



U5PVR 의 활용도를 높이기 위하여, U5PVR 은 안드로이드 커널을 공유하는 리눅스 펌웨어가 설치되어 있습니다.

(혹시나 설치가 되어 있지 않다면 설치 게시글을 통해서 설치해 주시길 바랍니다.)


기본 베이스는 debian 8 jessie 입니다. 실은 U5PVR CPU 는 64비트를 지원하는 CPU 입니다만, 안드로이드 시스템 자체가 32비트로 구동되고 있기 떄문에 리눅스 펌웨어도 armhf 패키지에 맞추서 빌드되었습니다.




1. 기본 내장 기능


Plex Media Server (1.4.4.3495)


플렉스 미디어 서버 패키지 입니다. 비공식 레포를 활용하여 설치가 되며 업데이트가 나옴과 동시에 업데이트를 수행하면 최신버전으로 업그레이드를 하실 수 있습니다. 


한편, ARM 에서 왜 Plex Media Server 를 사용하냐고는 할 수 있습니다. 트랜스코딩도 원활하지 않은데 왜 사용할까요? 이는 플렉스 미디어 서버가 모든 미디어를 다른 장치로 스트리밍 하는데에 최적화가 되어 있으며 파일만 넣어두면 메타데이터를 찾아서 이쁘게 정리해주는 기능이 있기 때문입니다. Plex Media Server 가 트랜스코딩 기능을 가지고는 있지만, ARM 기반 CPU 파워를 사용해서 트랜스코딩을 하기 때문에 매우 제한적이고 거의 트랜스코딩이 되지 않는다고 생각하시면 편하실 듯 합니다. 다이렉트 플레이나, 음성만 트랜스코딩 하는 경우는 무리가 없습니다.


TVheadend (4.1-2426)



본래 2튜너 입력을 받아들이기 위해서 이온UI (이온TV) 전용으로 만들어진 TVH는 튜너 방송 재생에 특화 되어 있어서 기능이 제한적입니다. 이 문제를 해결하기 위해서 리눅스 펌웨어에 TVheadend 최신 빌드 버전을 내장하게 되었습니다.


USB 튜너 입력을 받아 들여 작동은 되지 않습니다만, IP 프로토콜을 이용하는 HD 홈런은 인식하도록 빌드 되었으며 정상적으로 작동하는 것도 확인을 하였습니다. 


Pure-ftpd   



FTP 서버 기능으로써 pure-ftpd 패키지를 내장하였습니다. 여타 vsftpd , proftpd 도 있지만 이 pure-ftpd 를 선택한 이유는 U5PVR 리눅스에서 가장 잘 구동되는 FTP 서버이기 때문입니다. 기본적으로 액티브 모드 전송방식 대신에 패시브 모드 방식의 전송을 사용하며 리눅스 실계정을 통한 인증이 아니라 가상계정을 통해 접근을 하도록 되어 있습니다.


ffmpeg 3.2.4




이 ffmpeg 는 static 빌드로 바이너리만 내장이 되어 있습니다. 이 ffmpeg 를 넣어 둔 이유는 TVheadend 의 효용성을 높이기 위함입니다. 먹스를 pipe 로 등록하실 때 사용하시면 됩니다. 혹은, 파일의 컨테이너를 바꾸는 용도로 사용하셔도 됩니다.


transmission-daemon




토렌트를 받는 클라이언트입니다. 기본적으로 웹UI 패치가 작업되어 있습니다.


Python-mutagen

mutagen 패키지는 파일의 태그의 언어셋을 바꿔주는 라이브러리입니다. 이를 리눅스 펌웨어에 내장하고 있으며 토렌트를 통해서 파일을 받은 후에 Plex 에서 라이브러리를 추가하면 한글이 깨지는 경우가 발생합니다. 이 경우를 방지하기 위해서 python-mutagen 패키지를 내장하였습니다.


(삼바의 경우 이미 안드로이드 설정에 내장되어 있는 부분이며, 내부 전용으로만 사용하기 때문에 기본 삼바 서비스를 죽이면서 까지 리눅스 펌웨어에 포함 시키지 않았습니다.)



2. 간단하게 SSH 를 통해 U5PVR 리눅스에 접근해보기.


Xshell 이나 putty 를 통해서 U5PVR 아이피로 접근을 시도해 보면 아래와 같이 리눅스 쉘이 열리게 됩니다.


먼저, 설정으로 이동하여 자신의 아이피를 확인하여 컴퓨터에서 접속하시거나 내장된 JuiceSSH 앱을 통해 127.0.0,1 로 접근하실 수도 있습니다.


저는 이더넷을 통한 IP 가 192.168.100.35 로 잡혀있는 상태입니다.



계정정보는 아래와 같습니다.


접속 주소 : U5PVR 의 이더넷 아이피 혹은 와이파이 아이피

포트 : 22

아이디 : root

패스워드 : u5pvr


먼저 Xshell 로 접근을 해 보겠습니다.


호스트 이름을 입력해 줍니다.



생성된 목록으로 접근을 시도하면 아이디와 비밀번호를 물어보게 됩니다. 초기 값으로 로그인을 합니다.




정상적으로 접근이 완료 되었습니다.



다음으로 Putty 를 통해서 접근해 보도록 하겠습니다.



아이피를 입력하고 Open 을 누르면 키 지문을 추가할지 물어봅니다. 예를 누르고 넘어갑니다.



아이디와 비밀번호를 입력하면 아래와 같이 리눅스 쉘이 열립니다.



실행중인 프로세스와 리소스를 일목요연하게 보여주는 htop 패키지를 실행해 보았습니다.



네트워크 구성을 보고 설정할 수 있는 ifconfig 을 실행해 보았습니다.



다음으로 apt-get update 명령어를 입력하여 패키지 리스트를 업데이트 해 보았습니다.





3. Plex Media Server 대시보드 맛보기.


다음은 U5PVR 에 설치된 Plex Media Server 에 웹으로 접근해본 사진입니다.


접근 정보는 아래와 같습니다. 초기에는 계정 및 라이브러리 설정부터 차근차근 하도록 되어 있습니다.



라이브러리를 몇가지 설정해 둔 스크린샷입니다.



위 사진에서 음악 라이브러리가 한글이 깨지지 않는 것을 볼 수 있습니다. 이 부분은 python-mutagen 패키지를 통해 태그를 utf-16 으로 변환 후 미디어 라이브러리를 생성한 것입니다.


한편, Plex 서버 설치시, 각종 플러그인들을 설치해야하는데 이 부분은 SD카드에 플러그인 파일을 넣어줌으로써 해결이 가능하게 되어 있습니다.

(다음 메타 정보 플러그인, Youtube 채널 플러그인, TVH 플러그인 등등)




4. Transmission-daemon 토렌트 클라이언트 맛보기.


기본적으로 토렌트 클라이언트는 Web UI 를 사용하도록 되어 있습니다.


웹 UI 는 신 버전으로 설치를 해둔 상태입니다.


주소 : http://U5PVR아이피:9091/

아이디 : u5pvr

비밀번호 : u5pvr


포트 포워딩을 통해서 핸드폰 transmission remote 앱으로 컨트롤이 가능합니다.




5. TVHeadend 맛보기.


TVHeadend 는 기본적으로 아래의 방법으로 접근합니다.


주소 : http://U5PVR아이피:9981/

아이디 : u5pvr

비밀번호 : u5pvr



HD 홈런 지원을 하는 TVheadend 4.1-2426 버전이 내장되어 있습니다.

(차후에 업데이트 릴리즈가 있을 예정입니다.)



다음으로 이온TV 의 내장 TVHeadend 입니다.



기본적으로 ID : PW 가 없는 상태입니다.


아래처럼 이온TV 에 최적화된 3.6버전의 TVheadend 가 설치되어 있습니다.




다음 글 부터 기본 기능에 대해서 자세히 알아볼 예정입니다.


감사합니다.




http://cafe.naver.com/mk802/20190


저작자 표시 비영리 변경 금지
신고


 
Google+