픽셀 재생 중 기록 내보내기

구글 픽셀폰은 배경에서 재생되고 있는 노래를 픽셀로 식별하고 스크린을 잠그는 등 편리한 '재생 중' 기능을 가지고 있다.또한 현재 재생 내역을 보고 음악/SPotify/Apple Music을 재생할 수 있도록 설정에서 노래를 내보낼 수 있습니다.기본적으로 저는'Now playing'에 약 1년 반 동안 누적된 곡으로 총 1500곡을 모았습니다.
그러나 내가 최근에 발견한 바와 같이, 내가 픽셀을 떠나기로 결정했을 때, 나는 끝없는 낙담을 느꼈다. 구글은 너에게 목록을 CSV/SPotify/text로 대량으로 내보내는 간단한 방법을 주지 않았다.1천500곡 중 한 곡을 개별적으로'나눔'하고 이를 스포티파이 플레이리스트에 추가하는 데 몇 시간이 걸리는 것은 도저히 받아들일 수 없는 일이다.adb backup을 사용하여 휴대전화에서'재생 중'인 역사 데이터베이스(본문을 작성할 때까지 안드로이드 9의 픽셀 3XL)를 추출하는 것은 상당히 간단하고, 간단한 스크립트를 사용하여 가장 편리한 형식으로 데이터를 추출할 수 있다는 사실이 증명되었다.셸 유틸리티를 사용하여 timestampspotify_track_id이 있는 CSV를 생성합니다.
선결 조건은 매우 간단하다. 컴퓨터에adb를 편리하게 설치해야 한다.모든 운영 체제에 대한 설명서(예: this one)가 많기 때문에 자세한 설명은 하지 않겠습니다.adb 설정이 정확하면 USB 케이블을 통해 휴대전화를 연결한 후 케이스에서 ./adb devices을 운행하여 다음과 같은 내용을 출력한다.
$ ./adb.exe devices
List of devices attached
8BPK0YFHJ device
(Windows 10 설치에서 Ubuntu를 사용하기 때문에 본문에서 .exe 실행 가능한 파일이 있는 bash 명령을 볼 수 있습니다.장치가 표시되면 다음 단계를 계속할 수 있습니다.

애플리케이션 데이터 백업
재생 중인 프로그램이 어느 것과 관련이 있는지 알 수 없기 때문에 시간이 좀 걸렸다.'설정' > '소리' 에서 역사 기록에 접근할 수 있지만, '설정' 프로그램과 통합하면 의미가 없습니다.그래서 이름에 있는 '재생 중' 이나 '음악' 을 포함해야 한다. 그렇지?잘못했어요.시스템 응용 프로그램에서 하나를 삭제하고 구글 검색을 더하면 정확한 응용 프로그램이 픽셀 환경 서비스라는 것을 알려준다.
다음에 응용 프로그램에 대응하는 패키지를 찾기 위해 시스템 패키지(./adb.exe shell pm packages list -s)와 단어 com.google의grep를 열거했다.이것은 그것을 상당히 쉽게 만들었다.소포는 com.google.intelligence.sense입니다.
다음 부분은 운이 좀 필요합니다. 고맙게도 구글은 앱에서 android:allowBackup 로고를 사용하지 않았습니다.만약 그들이 있다면, 이것은 막다른 골목이 될 것이다.유일한 선택은 터치 명령을 기반으로 하는adb 스크립트를 만들어서 모든 노래를 Spotify 재생 목록으로 내보내는 것입니다.스크립트 작성을 제외한 수동 작업은 필요하지 않지만 시간이 필요합니다.이것은 내가 가장 하고 싶지 않은 일이다.
다행히도 com.google.intelligence.sense에서 진행된adb 디버깅은 여전히 사용 상태이며, 소홀함 때문이거나, 예상된 기능으로서 사용되고 있다.그런 다음 모든 어플리케이션 데이터를 컴퓨터에 백업할 수 있습니다.
$ ./adb.exe backup -f ambient.ab com.google.intelligence.sense
WARNING: adb backup is deprecated and may be removed in a future release
Now unlock your device and confirm the backup operation...
(구글에서 버려진 또 다른 유용한 기능은 놀랍다).1분 안에 디바이스의 백업을 완료해야 합니다.내 애플리케이션에는 백업 크기를 170MB 정도로 늘릴 수 있는 슈퍼팩스라는 것이 많다.

데이터베이스 파일 추출
현재, 우리는 이미 응용 프로그램 데이터를 추출했으니, 이를 압축 해제하고 데이터베이스를 추출할 때가 되었다.Android 백업은 본질적으로 tar gzip 아카이브이며 약간의 비뚤어진 부분이 있습니다.그것들을 추출할 수 있는 방법은 매우 많지만 (Android backup extractor이라는 자바 유틸리티 포함), 나는 다음 명령만 사용했다.
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 ambient.ab ) | tar xfvz -
위의 명령에서 우리는 \x1f\x8b\x08\x00\x00\x00\x00\x00 헤더를 ambient.ab 파일에 미리 걸고 tar xvzf -으로 그것을 추출할 것이다.
이것은 응용 프로그램 데이터가 있는 현재 디렉터리에 apps/com.google.intelligence.sense을 만들 것입니다.우리는 데이터베이스 파일 apps/com.google.intelligence.sense/db/history_db에만 관심이 있습니다. 이것은 SQLite 데이터베이스 파일입니다. (또 다행히도 암호화되지 않았습니다.)

재생 중인 히스토리 데이터베이스 찾기
SQLlite을 설치하여 데이터베이스를 살펴보겠습니다.명령 .tables에는 데이터베이스의 모든 테이블이 나열됩니다.
sqlite> .tables
android_metadata recognition_history
좋아, 이것은 보기에 매우 간단하다.android metadata표는 한 줄만 구역 설정을 가지고 있기 때문에 거의 쓸모가 없다.recognition_history표를 살펴보겠습니다.
sqlite> PRAGMA table_info(recognition_history);
0|timestamp|LONG|0||1
1|history_entry|BLOB|0||0
2|track_id|STRING|0||0
3|shards_region|STRING|0||0
4|downloaded_shards_version|INTEGER|0||0
5|core_shard_version|INTEGER|0||0
아, 돈 내!history_entry은 반점인 것 같지만, 한 줄을 보면:
sqlite> select * from recognition_history limit 1;
Europe/WarsawJ
/g/11c6tt7zl9Jyandroid-app://com.apple.android.music/https/itunes.apple.com/us/album/confidently-lost/1209647010?i=1209647307&ign-gact=2/m/013d79knJH:https://www.deezer.com/track/143171428/radio?autoplay=true
/m/03c2ckdJVHandroid-app://com.spotify.music/spotify/track/0RTnMChwd0ARVY3zOyNdaP?v=T
/m/04yhd6cJpbhttps://www.iheart.com/artist/Sabrina+Claudio-31483691/songs/Orion%27s+Belt-45519571?autoplay=true
/m/0c3zxqxJyandroid-app://com.google.android.music/http/play.google.com/music/m/Tigjmk45m2k2yqavlr7edrkcut4?signup_if_needed=1&play=1
t_tfgj6vzLvnUjConfidently Lostp|Tigjmk45m2k2yqavlr7edrkcut4|xa|100|2
Blob 형식은 유니코드 데이터로 보입니다.그러나 가장 좋은 것은 재생 목록으로 직접 내보내는 것과 거의 같다.Spotify track id, Play Music track id, Deezer id, Apple Music id가 있기 때문에 재생 목록에 곡을 직접 추가할 수 있습니다. 어떤 구독 서비스를 사용하든지 (그 중 하나라면!)

데이터베이스 내보내기
마지막으로 SQLite 데이터베이스를 열고 recognition_history의 모든 줄을 조회하여 파일로 내보내고 각 줄을 필요한 형식으로 변환합니다.첫 번째 반응은 파이톤 스크립트를 작성하는 것입니다. 그러나 이것은 sed을 사용하여 모든 기록을 필요한 형식으로 바꾸는 것보다 길고 오류가 발생하기 쉽습니다.또한 환경 설정이 필요하지 않습니다.
나는 timestampspotify_track_id을 CSV 파일로 압축할 것이다.우선, 우리는 이 열들을 파일로 내보내려고 한다.history_entry에는 "\n"문자와 가능한 "\r"문자가 포함되어 있으므로 행마다 기록이 하나씩 있고 sed을 편리하게 사용할 수 있도록 삭제해야 합니다. 따라서 아래 replace()에서 SELECT 함수를 사용하십시오.
sqlite> .headers on
sqlite> .mode csv
sqlite> .output results.csv
sqlite> select timestamp, replace(replace(history_entry, CHAR(10), '|'), CHAR(13), '|') as spotify_track_id from recognition_history;
현재 디렉터리에 조회 줄을 포함하는 파일 results.csv을 만들 것입니다.계속하기 전에 각 행에 질의 행이 있는지 확인합니다(BLOB에 인쇄할 수 없는 문자와 유니코드가 남아 있는 것이 좋습니다).
이제 유니코드 문자를 삭제하면 sed에 문제가 발생하지 않습니다.sed의 일부 버전은 유니코드를 사용할 수 있지만 언어 환경 문제를 디버깅하는 데 몇 시간이 걸렸기 때문에 저는 팬이 아닙니다.유니코드 문자를 삭제하려면 sed 명령을 사용하여 \x80-\xFF 범위의 문자(즉 10진수 128-255, ASCII 범위를 초과)를 검색합니다.LC_ALL=C은 언어 환경을 ISO "C"로 설정합니다. 이것은 나에게 적합한 유일한 언어 환경입니다.
LC_ALL=C sed -i -r 's:[\x80-\xFF]:.:g' results.csv
위의 -i 스위치는 입력 파일을 적절하게 변경할 수 있도록 합니다.모든 유니코드 문자가 사라졌는지 확인하려면 grep --color=auto -P '[\x80-\xFF]' results.csv에서 일치하는 문자가 반환되지 않았는지 확인하십시오.그 다음에는 타임 스탬프와 Spotify track id만 sed 출력하면 됩니다.
sed -i -r 's:^([0-9]+).*spotify/track/([A-Za-z0-9]+).*:\1,\2:g' results.csv
위 명령의 정규 표현식은 먼저 줄의 시작 시간 스탬프 (^[0-9]+) 와 일치하고, 줄의 나머지 부분과 일치하며, 문자열 spotify/track/[A-Za-z0-9]+ (즉 트랙 id 추출) 을 주의하십시오.

결론
이렇게head -n 5 당신의 results.csv 파일은 시간 스탬프와 추적 ID를 보아야 합니다. 줄마다 하나씩 있습니다.대량 추가 도구 또는 일부 API 호출을 사용하면 재생 목록에 트랙을 추가할 수 있습니다(단, API 할당량에 유의).상술한 해결 방안은 곡에 대한 최종 목표를 충족시키기 위해 (정규 표현식 변경을 통해) 또는 확장 (스크립트를 통해) 하기 쉽다.

좋은 웹페이지 즐겨찾기