Google Play Music Sync CLI with gmusicapi on Linux


1. 개요

-. NAS 있는 음악파일을 google music sync하기 위한 command line interface program 찾았으나
 
없어서 python script 작성함.

 

2. gmusicapi : https://github.com/simon-weber/gmusicapi

-. unofficial API for Google Play Music

-. 파일, playlist, radio 등에서  음악을 플레이하고 불필요한 파일을 지우기 위한 Mobileclient upload
 
등의 관리를 위한 Mobilemanager class 있음.

-. Mobileclient google play music 등록되어 있는 e-mail password 로그인하고,
   Mobilemanager
oauth 로그인한다.

-. Mobilemanager oauth 방법

  1. Musicmanager().perform_oauth(oauth_filepath) 실행
  2. 출력된 key 포함된 링크를 복사하여 웹브라우저로 접속함
  3. 인증과정을 거치면 google play music 에서 인증키를 출력함
  4. 출력된 인증키를 복사하여 실행 코드 창에 붙여넣고 enter 하면 인증완료

 

3. python code 작성

-. 디렉토리 sync 위해서

  1. google play music 파일 리스트를 가져오고 : Mobilemanager

def make_rmt_song_list(owner):

    # return list of dictionary which has 'title', 'id'

    result =[]


    mm = Musicmanager()

    mm.login(oauth_credentials=oauth_filepath(owner),  uploader_id=USERS[owner]['UPID'])


    for fn in mm.get_uploaded_songs():

        result.append({'title':fn['title'],'id':fn['id']})


    mm.logout()


    return result


  1. local 파일 리스트와 비교하여
  2. local 없는 파일은 google play music 에서 파일을 지움 : Mobileclient
    이때 지우는 것은 google play music  song id


def make_rmt_song_list(owner):

    result =[]

    mc = Mobileclient()

    mc.login(USERS[owner][‘e-mail'],USERS[owner]['pwd'], Mobileclient.FROM_MAC_ADDRESS)


    for song in delete_list:

        print song['title'] + " is being deleted now... "

        result.append({'title': song['title'], 'result' mc.delete_songs(song['id'])})


    mc.logout()


    return result


  1. google play music 없는 파일은 업로드함 : Mobilemanager

def __upload(upload_list, owner):

    result =[]

    mm = Musicmanager()

    mm.login(oauth_credentials=oauth_filepath(owner),  uploader_id=USERS[owner]['UPID'])


    for song in upload_list:

        print song + " is being uploaded now... "

        result.append({'title':song, 'result'mm.upload(song)})


    mm.logout()


    return result


  1. User정보는 dictionary 관리함

USERS = { u’id : {u’UPID':u'mac address', u’e-mail’:u'your email', u’pwd’:u'your password}}


4. Trouble Shooting

-. UPID Issue

: UPID 정보를 자신의 mac address 하기도 하고 비워두기도

: 계정이 여러 개인 경우 기기 하나를 모든 google play music 계정에 접속해서 기기 등록을 하고,
   UPID
등록한 기긱의 MAC adress 하였으나, 일부 계정은 인증이 안됨.

: 비워두는 경우, mac address 넣는 경우 등을 계정별로 시도해보아서 결정함.


    5. 스크립트 용법

    -. 필요한 module 설치

    : sudo pip install gmusicapi

    : sudo pip install argparse

    -. gmManager.py 파일 내에 configuration 부분에 사용자 정보를 추가함.

     :  DEST = u'인증파일을 저장할 디렉토리' #ex DEST = u'~/.config/gmusic/'

     : USERS = { u'사용자'  : {u'UPID':u'mac 주소', u’e-mail’:u’로그인용 이메일’, u’pwd’:u’암호(평문)'}}

       (예) DEST = u’~/.config/gmusic/‘

            USERS = {u’lisa’: {u’UPID’:u’00:00:00:00:00:00’, u’e-mail’:u’somewhere@on.mars’, u’pwd’:u’imsipasswd’}}

    -. google play music 에서 사용자 인증 키를 받음.

    : gmManager.py -o dummy_director 사용자  (ex) ./gmManager.py -o ./ lisa

    : 출력된 key 포함된 링크를 복사하여 웹브라우저로 접속하여 인증과정을 거침

    : google play music에서 인증키를 출력하면 복사하여 실행 코드 창에 붙여넣고 enter 하여 인증

    -. 명령어 실행

    : local directory google play music sync. google play music 파일 local 없으면 지움

     

    ./gmManager.py -s local_directory 사용자 (ex) ./gmManager.py -s ./Mp3s lisa

     

    : local directory 파일   google play music 없는  파일만 upload . google play music

      파일 local 없는 파일도 지우지 않음

     

    ./gmManager.py -u local_directory 사용자 (ex) ./gmManager.py -u ./Mp3s lisa

     

    : local directory 파일을 체그없이 무조건 google play music 올림. 중복된 파일의 경우

     google play music에서 에러

     

    ./gmManager.py local_directory 사용자 (ex) ./gmManager.py ./Mp3s lisa


    -. 스크립트 파일 : gmManager.py


    Posted by 옴팡진
    ,
    1. Libreelec Update 7.0.3 -> 8.2.3
      • 참고 Site 

      • 설치

        • MXQ version 다운로드 
          : https://kszaq.libreelec.tv/s805/8.2.3.1/LibreELEC-S805.arm-8.2-8.2.3.1-MXQ.img.gz
        • 7zip으로 ~~.img.gz 압축을 .
        • Win32DiskImager microSD img 써서 booting micro SD 만듦.           micro SD에는 aml_autoscript, KERNEL.IMG and SYSTEM 3개의 파일이 있음.
        • SD card slot 넣고 reset 버튼을 누른 파워 , 10 후에 reset 누름 해제.
          LibreElec 으로 부팅 하여 초기 셋팅 재부팅하여 wifi 등의 kodi 설정함.
        • libreelec /etc read only 마운트되어 설정을 변경할 없음.  
          /storage/.config/ 설정파일을 변경하면 부팅 스크립트가 /etc 설정보다 먼저 읽어와서 적용함.


    1. Trouble Shooting
      • 1080P 끊김

        • MK809IV PLUS wifi 시그널이 안잡혀서, wireless 무선 network off  
          usb 10 Mbps network dongle
          연결함.  USB2.0 이라서 100 Mbps 불가함.
        • Webdav 물려있는 source에서 720P play 가능하나 1080P 버퍼링이 심해서 볼수가 없음. Network 속도가 느려서라기보다는 usb 사용의 오버헤드가 너무 크고, wifi 하면 전용버스 사용으로 끊기지 않는 것으로 추정.
        • (해결) wifi 2.4G 신호간섭으로 내부의 안테나로는 시그널을 잡을 없음.
          ->
          디바이스를 분리하여 내부의 안테너를 외부로 뽑음.
              (
          참고 : https://www.youtube.com/watch?v=jxouOdA5_6E)

      • 이외에는 문제없음.


    Posted by 옴팡진
    ,

    1. Bit Perfect System

    • 디지털 음원을 손실없이 전달/재생하여 아날로그 소리를 내는 시스템을 의미한다


    • 소스
      • 원래 소리는 아날로그 신호로 연속된 주파수와 진폭을 가지고 있는데, 이를 불연속적인 디지털 신호로 변환하여 디지털 음원을 만든다
      • 우리가 흔하게 접할 있는 디지털 음원 매체인 CD (Compact Disc) 왼쪽/오른쪽 각각의 소리를 진폭을 65,536 단계로 나눠서 1초에 44,100번을 같은 간격(CD spec. 44.1kHz x 16bit x 2ch)으로 디지털로 변환하여 저장한다
      • 이렇게 변환된 디지털 파일은 1초당 44.1k x 16bit x 2ch 이므로 1,411 kbit 해당된다.
        실제로 CD-DA 프레임으로 구분되어 있고 각각의 보정을 위한 CIRC 붙어서 데이터 양이 늘어나지만 기본적으로 데이터 양은 늘어나지만 음원 관점에서는 1,411 kbit 정도로 생각할 있다. 자세한 내용은 wiki  https://en.wikipedia.org/wiki/Compact_Disc_Digital_Audio 참고.
      • 3 하나의 음원 파일의 용량은 1,411 kbit x 60 x 3 = 31.75 MB 정도로 커서 이를 압축하는 방법들이 고안되기 시작했고 중에 가장 널리 쓰이는 것이 MP3이다. MP3 일반 사람이 듣기 어려운 20kHz 이상의 음을 삭제하거 높은 뒤의 낮음 등을 삭제하는 등의 인지공학적으로 음손실을 최소화하여 손실 압축이지만  bit rate 192 kbit/s 정도로 변환하면 일반인이 CD 소리와 거의 구별하기 힘들다고 한다. 경우 CD 음원 용량 1,411kbit/s 대비 86.4% 압축률이다
      • 하지만, 현재 인터넷 속도가 발전하고 저장 매체의 용량이 증가함에 따라서 압축률 보다는 음질에 주안점이 주어지면서, MP3 bit rate 192 kbit/s 대신에 320 kbit/s 변환하고 손실압축인 MP3 대신에 FLAC 같은 비손실 압축 기술이 유행하고 있다. 보통 Melon 같은 곳에서는 bit rate 320 kbit/s 전환한 MP3 별도의 FLAC 파일을 서비스하고 있다.
      • Hi-Fi Audio 쪽에서 CD 보다 높은 음질을 얻고자 했던 SACD 등도 있으니 관심있으시면 찾아보세요


    • 디지털 인터페이스
      • MP3 이건 FLAC 이건 보통 우리가 사용하는 디지털 음원은 CD에서 것을 손실 또는 무손실 압축한 것이기 때문에 전송률이 가장 높은 것은 CD-DA이다. 따라서 CD-DA 전송할 있는 디지털 인터페이스이면 거의 모든 디지털 음원을 전송할 있다.
      • 이러한 디지털 인터페이스 중에서 가장 광범위하게 사용되는 것은 CD 개발사인 소니와 필립스에서 개발한 S/PDIF (Sony/Philips Digital Interface)이다. S/PDIF 개의 라인을 사용한 직렬 인터페이스로 라인의 설치 운용이 쉽고, 대역폭이 1,536 kbit/s 달해 1,411 kbit/s  전송률을 갖는 CD-DA 손실없이 전송할 있어서 CDT(CD Transport) - DAC(Digital to Analog Converter) 간과 같이 디지털 디바이스 간에는 대부분 S/PDIF 사용한다
      • S/PDIF 라인을 갖는 비동기화 신호라서 jitter 취약해서 이를 극복하기 위하여 데이터라인과 함께 클럭 라인이 있는  I2S(Inter IC sound) 사용하기도 한다. I2S sound IC 간의 내부 통신을 위하여 필립스에서 고안한 것으로 데이터 라인과 별도로 싱크를 위한 클럭 라인을 가지고 있다. 별도의 클럭이 있어서 sync 하기가 용이하여 jitter에서 유리하여 내부에서 벗어나 디바이스간에 데이터 전송에도 사용된다.
      • 스테레오 뿐만 아니라, Dolby Digital, DTS 등의 다채널 서라운드 사운드도 S/PDIF 대역폭 이내로 전송률이 되도록 데이터를 압축하여 전송하고 디코더가 이를 다시 채널별로 분리하고 아날로그 소리로 변화하여 다채널 서라운드 사운드를 구성한다. 다만, 최근의 DD+ DTS-HD 등은 전송률이 S/PDIF 대역폭을 넘어서 HDMI 같은 인터페이스를 사용하기도 한다.


    • 디지털 인터페이스의 선정
      • 현재 사용하고자 하는 디지털 음원은 대부분 320 kbit/s 넘지않고, 가지고 있는 DAC I2S 지원하지 않아서, optical cable 갖는 S/PDIF 사용하기로 한다


    2) System 구성

    • S905 ALSA + MPD + Volumio Interface -> DAC -> 6V6 진공관 AMP


    • S905 ALSA 설정
      • 참조 : https://alsa.opensrc.org/DigitalOut
      • 아래처럼 ‘aplay -l’ 명령어를 이용하여 sound hardware devices 확인한다기본적으로 아래와 같은 3개의 디바이스가 나오고, 이중 SPDIF 사용할 것이다. 여기서 확인해야할 내용은 card 번호와 device 번호이다. SPDIF card 번호는 ‘0’ 이고 device 번호는 ‘1’ 이다


    kodi@amlogic:~$ aplay -l

    **** List of PLAYBACK Hardware Devices ****

    card 0: AMLM8AUDIO [AML-M8AUDIO], device 0: I2S.38 dummy-0 []

      Subdevices: 1/1

      Subdevice #0: subdevice #0

    card 0: AMLM8AUDIO [AML-M8AUDIO], device 1: SPDIF.39 dit-hifi-1 []

      Subdevices: 1/1

      Subdevice #0: subdevice #0

    card 0: AMLM8AUDIO [AML-M8AUDIO], device 2: PCM.40 pcm2bt-pcm-2 []

      Subdevices: 1/1

      Subdevice #0: subdevice #0


      • 이를 ‘/etc/asound.conf’ default sound device 반영한다. 여기서 주의 점이 있는데, 기본적으로 PCM 으로 상정되어 있어서 인지 샘플링 레이트가 44.1kHz 상정하는데, SPDIF 48kHz 필요하다. 이에 SPDIF 사용하려면 ‘rate 48000’ 추가해준다. 부분을 빼면 소리가 안나고 로그를 확인하며 인자를 잘못 줬다는 에러 메시지를 뿌린다.


    kodi@amlogic:~$ cat /etc/asound.conf 

    pcm.!default {

            type hw

            card 0

            device 1

    rate 48000

    }


      • 설정을 마치고 적당한 음원파일로 소리가 나는지 확인한다. 소리가 나면 ALSA 설정

    play file.wave

    mplayer file.mp3 -ao alsa  


    • MPD (Music Player Daemon) 설정
      • 참조 : http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_rpi&wr_id=51
      • 사이트를 참조해서 MPD 설치하고 /etc/mpd.conf 설정한다. 주석을 읽으면서 해당항목만 수정하면 되므로 쉽게 설정가능한다. 다만, audio output 부분에서 SPDIF 사용할 것이므로 ALSA 셋업시 확인했던 SPDIF card 0, device 1 “hw:0,1” 추가해준다. , ALSA default 셋팅에 설정하여 불필요할 같기는 하지만, format 48kHz, 16bit, 2ch 하도록 ‘format   “48000:16:2” ‘ 추가한다


    kodi@amlogic:~$ cat /etc/mpd.conf |grep ^[^#]

    music_directory your music directory"

    playlist_directory "/var/lib/mpd/playlists"

    db_file "/var/lib/mpd/tag_cache"

    log_file "/var/log/mpd/mpd.log"

    pid_file "/run/mpd/pid"

    state_file "/var/lib/mpd/state"

    sticker_file                    "/var/lib/mpd/sticker.sql"

    user your user"

    group                           “your group"

    bind_to_address "0.0.0.0"

    port "6600"

    log_level "default"

    auto_update    "yes"

    auto_update_depth "3"

    follow_outside_symlinks         "yes"

    follow_inside_symlinks         "yes"

    zeroconf_enabled "yes"

    zeroconf_name "MPD Music Player"

    input {

            plugin "curl"

    }

    audio_output {

    type "alsa"

    name "My ALSA Device"

    device         "hw:0,1" # optional

    format         "48000:16:2" # spdif 48000, audio 44100 

    }

    filesystem_charset "UTF-8"

    id3v1_encoding “UTF-8"



       

    3. 잔여 Audio 정리

       - 5.1 Ch  -> 3.1 ch : 리어스피커 + 리어스피커 스탠드 미사용

       - source CDP (필립스 프로2 ) 미사용  

    Posted by 옴팡진
    ,