[태그:] plexmediaserver

  • 과학하고 앉아있네 podcast 다운로드 + plex 관리 스크립트

    과학하고 앉아있네 podcast 다운로드 + plex 관리 스크립트

    과거 쎈호스팅에서 mp3를 다운로드를 제공했었는데, 팟빵 앱으로 접근하지 않는 사용자들을 제약하려고 주소를 옮겼다. 겨우 찾았는데, 쎈호스팅과 과학과사람들이 어떤 일을 했는지 이후 다운로드 서비스도 하고 있지 않았다. 귀찮아 방치했는데, 하드디스크로 바꾼 기념으로 찾아보니, 홈페이지가 rss를 제공하고 있었다.

    bash로 xml을 parsing하기 힘들어 xpath 도움을 받았다. xpath를 쓰지 않았을 때 정규표현식으로 억지로 뽑아냈다. xmllint도 있는데, 맨 처음 한 개만 제대로 출력하고 이 후 정보를 무시해버려 시간만 날렸다. 몇 시간 노가다 끝에 다음 방식으로 정리했다. 과거 노가다보다 훨씬 정확하고 보람차다.

    #!/bin/bash
    #cron을 위한 cd
    cd ???
    
    echo "TEDTalks Downloader v0.1"
    echo "by Denver Gingerich (http://ossguy.com/)"
    
    
    which wget
    if [ $? -eq 0 ]; then
    	echo "Using wget..."
    	GET_CMD="wget --quiet -O"
    else
    	which curl
    	if [ $? -eq 0 ]; then
    		echo "Using curl..."
    		GET_CMD="curl -L -o"
    	else
    		echo "Could not find wget or curl"
    		exit 2
    	fi
    fi
    
    FEED=feed_podcast.xml
    URLS=urls_podcast
    DIRNAME=파토의과학
    
    rm -f ${FEED}
    rm -f ${URLS}
    
    #podcast_address=http://www.podbbang.com/ch/6205
    podcast_address=https://feeds.feedburner.com/sciencewithpeople
    ${GET_CMD} ${FEED} ${podcast_address}
    
    #xpath 
    #get nth item
    #xpath -e "//rss/channel/item[position()=2]/title" temp2.txt
    patoCouter=10;
    #과학과사람들fileInfo.txt 만듦.
    #filename, path, title, 업데이트일 순으로 정리
    for i in $(seq 1 $patoCouter);
    do
    	#echo $i
    	title=$(xpath -q -e "//rss/channel/item[position()=$i]/title" ${FEED})
    	title2=$(echo $title | sed 's/<title>//g' | sed 's/<\/title>//')
    	title3=$(echo $title2 | sed 's/  / /g' | sed 's/,/_/g')
    	#echo $title3
    
    	fileTmp=$(xpath -q -e "//rss/channel/item[position()=$i]/enclosure" ${FEED})
    	file=$(echo $fileTmp | cut -d'"' -f2)
    	#echo $file
    
    	pubTmp=$(xpath -q -e "//rss/channel/item[position()=$i]/pubDate" ${FEED})
    	pub=$(echo $pubTmp| sed 's/<pubDate>//g' | sed 's/<\/pubDate>//'| cut -d',' -f2 | cut -d' ' -f1-4 | sed 's/^ //g')
    	#monthtmp=$(echo $pub | cut -d'-' -f2)
    	#daytmp=$(echo $pub | cut -d'-' -f1)
    	#yeartmp=$(echo $pub | cut -d'-' -f3)
    	#echo $pubTmp
    	echo $pub
    	#echo $monthtmp
    	#from
        #https://www.unix.com/shell-programming-and-scripting/191527-converting-month-into-integer.html
        #M=1
        #for X in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
        #do
    	#	[ "$monthtmp" = "$X" ] && break
    	#	M=`expr $M + 1`
    	#done
    	#myeardate=$(date --date="$(printf "%s" $yeartmp-$M-$daytmp)" +"%Y-%m-%d")
    	#echo $myeardate
    
    	printf "$title3" >> ${URLS}
    	printf "," >> ${URLS}
    	printf "$file" >> ${URLS}
    	printf "," >> ${URLS}
    	printf "$pub" >> ${URLS}
    	printf "\n" >> ${URLS}
    
    done
    
    cp ${URLS} ${DIRNAME}/파토가과학하고앉아있네FileAndTitle.txt
    
    mkdir -p ${DIRNAME}
    cd ${DIRNAME}
    for line in $(cat ../${URLS} | cut -d',' -f2);
    do
    	URL=$(echo ${line} | cut -d',' -f2)
    	FILENAME=`basename ${URL}|tr -d '\r'`
    	if [ ! -f "${FILENAME}" ]; then
    #	 || [ ${SIZE} -ne `ls -l "${FILENAME}" | awk '{print $5}'` ]; then
    		rm -f "${FILENAME}"
    		${GET_CMD} "${FILENAME}" "${URL}"
    	fi
    done

    plex media server가 정확하게 인식하도록 id3 태그를 각 파일에 입력했다.

    now0930@gen8:파토의과학$ ls -t
    파토가과학하고앉아있네FileAndTitle.txt  174371_1619141878558.mp3  174371_1621561758166.mp3  174371_1616052641424.mp3  174371_1617934621403.mp3  174371_1620965968488.mp3  details.txt
    174371_1616979006251.mp3                174371_1620359306326.mp3  174371_1622166509979.mp3  174371_1618471405918.mp3  174371_1617304165488.mp3  conver.jpg

    파토가과학하고앉아있네FileAndTitle.txt 파일은 id3를 입력할 수 있는 파일, 태그, 날자 데이터다.

    now0930@gen8:파토의과학$ cat 파토가과학하고앉아있네FileAndTitle.txt | head -10
    삼테성즈 S7E04 반도체 대란_ KF21 핵심기술 그리고 게임의 역사2!,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1622166509979.mp3,28 May 2021
    과학하고 앉아있네 S7E04 K박사 완전 복귀 특집! 암흑의 물질과 K박사의 어두운 미래,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1621561758166.mp3,21 May 2021
    격동 500년! S7E04 세계적인 나비박사 석주명 선생!,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1620965968488.mp3,14 May 2021
    뉴스룸! S7E04 생명연장의 시간표_ 그리고 나의 뇌를 다스리자! feat. 카이스트 김대수 교수,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1620359306326.mp3,07 May 2021
    삼테성즈 S7E03 화제의 메타버스 특집! Feat. 강원대 김상균 교수,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1619141878558.mp3,23 Apr 2021
    과학하고 앉아있네 S7E03 빛은 뭐고 LCD는 뭐고 OLED는 또 뭐냐? feat. 한림대 고재현 교수,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1618471405918.mp3,16 Apr 2021
    격동 500년! S7E03 태양의 정체를 밝히다! 세실리아 페인.,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1617934621403.mp3,09 Apr 2021
    뉴스룸! S7E03 화성 퍼시비어런스 엠바고 속보! 그리고 자연계 5번째의 힘 발견? feat. 박인규 교수,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1617304165488.mp3,02 Apr 2021
    (음질보정재업) 삼테성즈! S7E02 딥페이크_ 전기자동차_ NFT_ 비디오게임. Feat. K2박사_ 최팀장,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1616979006251.mp3,28 Mar 2021
    과학하고 앉아있네 S7E02 코로나백신 완전 털기! feat. 남재환 교수_ 김연희 기자,https://cdn-cf.podty.me/meta/episode_audio/22286/174371_1616052641424.mp3,19 Mar 2021

    details.txt 파일은 각 디렉토리별 어떻게 입력할지 대한 규칙이다. 각 폴더마다 스크립트를 다르게 사용할 수 없어, details.txt로 각 폴더 규칙을 정리했다.

    now0930@gen8:파토의과학$ cat details.txt 
    SONGEXP	$(cat $EXTRAINFO | grep $FILE | cut -d',' -f1)
    tmpSONGEXP	$(cat $EXTRAINFO | grep $FILE | cut -d$'\t' -f2)
    ARTISTEXP	"파토"
    ALBUMEXP	"파토가과학하고앉아있네"
    mYearDateEXPtmp	"2020-1-1"
    mYearDateEXP	$(cat $EXTRAINFO | grep $FILE | cut -d',' -f3)
    GENREEXP	"팟캐스트"
    FILETYPE	"mp3"
    PODCASTFILE	파토가과학하고앉아있네FileAndTitle.txt

    id3를 업데이트 하는 스크립트를 실행하면 각 폴더에 설정한 details.txt를 읽어 업데이트 한다. 이전에 이 내용을 포스트했다. 다 하고나니 이렇게까지 해야 하나 싶다. 관리하기 참 까다롭다. plex media server 스캐너까지 관리하고 싶은데, 어떻게 하는지 모르겠다. 모두 하면 다음과 같이 관리할 수 있다.

  • mp3 태그로 plexmedia server 정보 업데이트(2)

    mp3 태그로 plexmedia server 정보 업데이트(2)

    Plex로 음악을 들으면 좋은데, tag를 관리하기 어렵다. 심지어 플레이 리스트도 맘대로 뽑아낼 수 없다. plex로 관리하는 생각을 포기하고 mp3에 있는 id3를 직접 관리하기로 했다. 아래 코드 중 mp3로 변환하는 부분을 byte freaks 에서 사용했다.

    #!/bin/bash
    #for FILE in *.webm; do
    #   echo -e "Processing video '\e[32m$FILE\e[0m'";
    #   ffmpeg -i "${FILE}" -vn -ab 320k -ar 44100 -y "${FILE%.webm}.mp3";
    #one;
    
    
    #file이름을 수정.
    total=$(ls *.mp3 | wc -l)
    #echo $total
    trackNo=0
    for FILE in *.mp3;
    do
    	trackNo=$(expr $trackNo + 1)
    	#echo $trackNo
    	SONG=$(basename "$FILE" | cut -d"-" -f2|sed 's/^_//'| sed 's/_Official_Video//'|sed 's/_//g')
    	ALBUM="Evolution"
    	ARTIST="AlexisFfrench"
    	mYearDate="2018-08-31"
    	#echo $SONG
    	#echo $ALBUM
    	#echo $ARTIST
    	mid3v2 -t "$SONG" -A "$ALBUM" -a "$ARTIST" -y "$mYearDate" -T "$trackNo/$total" "$FILE"
    
    done

    이미지는 같은 폴더에 covor.jpg나 다른 이름으로 넣어주면 잘 찾는다. 앨범 이름이 같더라도 track에 번호가 없으면 같은 앨범으로 인식하지 않는다. 모두 수정 후 메타데이터 새로 고침하면 다시 읽는다. 자가 격리 기간에 앨범이나 정리해야지.

    하루 종일 해 본 결과 Plex가 너무 까탈스럽다고 결론 냈다. 게다가 각 회사마다 id3 태그를 지 멋대로 붙여 같은 앨범으로 인식시키는데 애 먹었다. 같은 앨범이더라도 장르가 다르면 다른 앨범으로 인식한다. 트랙도 겹치면 다른 앨범으로 본다. plex가 스캔하면 id3 정보를 자기 데이터 베이스로 저장하는데, id3 태그를 수정하더라도 지가 가진 정보를 변경하지 않는다. 권한을 6->0->6으로 주어 다시 인식시켰다. 결론은 각 폴더에 앨범을 설명하는 파일을 넣어주고, 스크립트가 파일을 읽어 일괄 업데이트 하는 형식이 가장 낫다고 냈다. 파일 이름에 작곡가, 곡 이름을 정리하고 이를 basename으로 정리했다. 나머지는 찾아서 details.txt에 넣었다. 앨범 커버는 동일 디렉토리에 cover.jpg로 넣으면 된다.

    다음 details.txt 파일은 앨범 폴더에 있다. 구분자는 스페이스가 아니라 탭 이다.

    SONGEXP	$(basename $FILE | cut -d'-' -f2 | sed 's/OfficialVideo//' | sed 's/\.mp3//')
    ARTISTEXP	$(basename $FILE | cut -d'-' -f1)
    ALBUMEXP	"Evolution"
    mYearDateEXP	"2018-08-31"
    GENREEXP	"Classical"

    이 파일을 참조하여 업데이트 하는 스크립트는 다음과 같다. 나중에 활용하려 COMMENT는 남겼다. youtube-dl를 –no-playlist로 하면 해당 곡만 다운로드 할 수 있다.

    #!/bin/bash
    #for FILE in *.webm; do
    #   echo -e "Processing video '\e[32m$FILE\e[0m'";
    #   ffmpeg -i "${FILE}" -vn -ab 320k -ar 44100 -y "${FILE%.webm}.mp3";
    #done;
    
    #FILE="AlexisFfrench-AMomentInTime-woETd5QW52E.mp3"
    #Details.txt 파일에 형식 정의 ^I로 구분됨.
    #SONGEXP: 곡 형식
    total=$(ls *.mp3 | wc -l)
    trackNo=0
    
    for FILE in *.mp3;
    do
    	trackNo=$(expr $trackNo + 1)
    	SONGEXP=$(cat ./details.txt | grep SONGEXP | cut -d'	' -f2)
    	#변수에서 읽은 expression을 실행하여 다시 변수에 할당.
    	eval song="$SONGEXP"
    	ARTISTEXP=$(cat ./details.txt | grep ARTISTEXP| cut -d'	' -f2)
    	#echo $ARTISTEXP
    	eval artist="$ARTISTEXP"
    	ALBUMEXP=$(cat ./details.txt | grep ALBUMEXP| cut -d'	' -f2)
    	eval album="$ALBUMEXP"
    	mYearDateEXP=$(cat ./details.txt | grep mYearDateEXP| cut -d'	' -f2)
    	eval myeardate="$mYearDateEXP"
    	GENREEXP=$(cat ./details.txt | grep GENREEXP| cut -d'	' -f2)
    	eval genre="$GENREEXP"
    	#echo $song
    	#echo $artist
    	#echo $album
    	#echo $myeardate
    	#echo $genre
    	mid3v2 -t "$song" -A "$album" -a "$artist" -y "$myeardate" -T "$trackNo/$total" --TCON $genre --TPE2 "$artist" "$FILE"
    
    done
    
    << COMMENT
    
    
    #file이름을 수정.
    total=$(ls *.mp3 | wc -l)
    echo $total
    #echo $total
    trackNo=0
    for FILE in *.mp3;
    do
    	trackNo=$(expr $trackNo + 1)
    	#echo $trackNo
    	#SONG=$(basename "$FILE" | cut -d"-" -f2|sed 's/^_//'| sed 's/_Official_Video//'|sed 's/_//g' | sed 's/\.flac//'|sed 's/^[0-9]\{1,2\}//'| sed 's/\.mp3//')
    	SONG=$(basename "$FILE" | cut -d'-' -f2| sed 's/\.mp3//'| sed 's/^ //g'|sed 's/^[0-9]\{1,2\} //g')
    	#SONG=$(basename "$FILE" | cut -d'-' -f1-2| sed 's/\.flac//'| sed 's/^ //g'|sed 's/^[0-9]\{1,2\} //')
    	#ARTIST=$(basename "$FILE" | cut -d'-' -f1 | cut -d'.' -f2)
    	#ARTIST="Leszek Mozdzer"
    	#ARTIST="Idil Biret"
    	ARTIST="다양한가수들"
    	#ARTIST="Ivo Pogorelich"
    	#ALBUM="Chopin Piano Favourites"
    	#ALBUM="The Best of Chopin"
    	ALBUM="가요추천1500"
    	#ALBUM="Chopin Recital"
    	#mYearDate="1985-02-15"
    	mYearDate="2020-04-11"
    	#echo $trackNo
    	#echo "$SONG"
    	#echo "$ALBUM"
    	#echo "$ARTIST"
    	#echo "$total"
    	#mid3v2 -t "$SONG" -A "$ALBUM" -a "$ARTIST" -y "$mYearDate" -T "$trackNo/$total" --TCON Classical --TPE2 "$ARTIST" "$FILE"
    	mid3v2 -A "$ALBUM" -a "$ARTIST" -T "$trackNo/$total" --TCON "Other" --TPE1 "$ARTIST" --TIT2 "$SONG" "$FILE"
    
    	#mid3v2 -T "$trackNo/$total" "$FILE"
    
    done
    COMMENT
    

    유투브에서 음원을 다운로드 하여 개인적으로 들으면 불법이 아니라고 한다.(–;) 구매하는 음원도 내가 정리해야 하는데 굳이 돈 주고 사야할지 모르겠다. 스트리밍으로 듣다가 음원을 구해 듣는 방식이 더 싸겠다.

  • mp3태그로 plexmedia server 정보 업데이트

    mp3태그로 plexmedia server 정보 업데이트

    mp3 tag, id3로 Plexmediaserver의 정보 업데이트 하기

    나는 plexmediaserver로 mp3를 저장하여 듣고 있다. plex에서 라이브러리로 mp3가 있는 경로를 알려주면, agent가 파일을 검색하여 그에 알맞는 가수, 앨범, 노래명을 정리한다. 내가 가진 mp3는 대부분 인터넷에서 받은 파일이라, tag 정보가 완전 제각각대로 되어 있다. 이 태그를 정리하지 않고, 곡 추가를 하면, plex가 같은 가수인데 철자가 달라 다른 사람으로 인식한다. 따라서 데이터베이스가 완전 개판이 된다. 전에는 태그를 수정을 했었는데, plexrk 이 수정분을 인식하지 못했다. 왜 그런지 궁금해 하다가 포기 했었다. 오늘 다시 좀 해보니 알 것 같다.
    plex agent는 처음 곡을 추가할 때만 mp3의 태그 정보를 자신의 DB로 읽어 들이는 듯 하다. plex가 자기가 가진 데이터베이스로 복사를 하면, 사용자가 tag를 수정했다고, plex가 자신의 DB로 업데이트를 안한다. 사용자가 한번 정보를 잘못 입력하면, 이를 마우스+클릭으로 수정해야 하는데, 시간이 많이 걸린다. 라이브러리 전체를 지운 다음에, 다시 추가를 하면 id3에서 plex DB로 다시 옮긴다.
    정리를 위해서, mp3에 있는 쓰레기 태그를 다 지워버리고, 내가 관리할 정보만 남겨 놓았다.
    stack overflow에 이와 관련된 스크립이 공개되어 있다.

    find ./ -type f -iname "*.mp3" -exec /usr/bin/mid3v2 --delete-frames=AENC,ASPI,COMM,COMR,ENCR,EQU2,ETCO,GEOB,GRID,LINK,MCDI,MLLT,OWNE,PRIV,PCNT,POPM,POSS,RBUF,RVA2,RVRB,SEEK,SIGN,SYLT,SYTC,TBPM,TCOM,TCOP,TDEN,TDLY,TDOR,TDRL,TDTG,TENC,TEXT,TFLT,TIPL,TIT3,TKEY,TLAN,TLEN,TMCL,TMED,TMOO,TOAL,TOFN,TOLY,TOPE,TOWN,TPE3,TPE4,TPOS,TPRO,TPUB,TRSN,TRSO,TSOA,TSOP,TSOT,TSRC,TSSE,TSST,TXXX,UFID,USER,USLT,WCOM,WCOP,WOAF,WOAR,WOAS,WORS,WPAY,WPUB,WXXX '{}' +

    tag를 수정하는 유틸리티는 여러개가 있으나, 셸에서 사용이 가능한 mid3v2를 선택했다.
    MP3 tag의 주요정보 내용은 아래와 같다.
    APIC A picture for the track, usually the albumcover.
    TIT1 Content group description (I guess could be deleted too)
    TIT2 The song title
    TPE1 The album artist
    TPE2 The artists (includes featurings)
    TRCK Tracknumber
    TALB Albumtitle
    TCON Genre
    TDRC Year of release

    이 정보에서 곡 이름, 앨범의 이름, 가수가 누구인지 등 몇 개의 정보만 관리한다. 나머지 정보는 관리하기 힘들기 때문에 지워야 된다. 여기에 엄한 정보가 들어가면, plex가 파일을 잘못 인식한다.
    가수는 동일하니, 아래의 명령어로 엄한 정보가 들어가 있는 파일을 찾았다. TPE1과 TPE2 두 종류가 있는데, plex는 이를 제대로 인식하지 못한다. TPE2는 지워주는게 좋다.

    now0930@:10cm$ find ./ -type f -exec mid3v2 {} \; | grep -e 'TPE1\|TIT2'
    now0930@:10cm$ find ./ -type f -exec mid3v2 {} \; | grep TALB
    

    plex는 앨범, 가수명, 트랙 이 세가지를 기준으로 보여준다. 트랙까지는 관리하기 힘들어 보인다. 일단 앨범 정보부터 아래와 같이 맞춘다.

    now0930@:10cm$ mid3v2 --TALB="10cm" *.mp3

    다음으로 가수명도 같은 방식으로 맞춘다. 수정 후 plex 라이브러리에 넣으면 제대로 정보가 올라간다.

    한가지 아쉬운 점이라면, 내가 TIT2에 곡 이름을 넣어야 됬는데, 파일이름이 대부분 곡 이름이다. basename으로 파일 이름을 뽑고, 이를 TIT2의 파라미터로 전달해야 하는데, 별도 스크립트를 만들어야 하는 작업처럼 보인다. 몇번 입력하다보니, 힘들어서 못하겠다.