픽셀 재생 중 기록 내보내기
10906 단어 androidnowplayingadbpixel
그러나 내가 최근에 발견한 바와 같이, 내가 픽셀을 떠나기로 결정했을 때, 나는 끝없는 낙담을 느꼈다. 구글은 너에게 목록을 CSV/SPotify/text로 대량으로 내보내는 간단한 방법을 주지 않았다.1천500곡 중 한 곡을 개별적으로'나눔'하고 이를 스포티파이 플레이리스트에 추가하는 데 몇 시간이 걸리는 것은 도저히 받아들일 수 없는 일이다.
adb backup
을 사용하여 휴대전화에서'재생 중'인 역사 데이터베이스(본문을 작성할 때까지 안드로이드 9의 픽셀 3XL)를 추출하는 것은 상당히 간단하고, 간단한 스크립트를 사용하여 가장 편리한 형식으로 데이터를 추출할 수 있다는 사실이 증명되었다.셸 유틸리티를 사용하여 timestamp
과 spotify_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
을 사용하여 모든 기록을 필요한 형식으로 바꾸는 것보다 길고 오류가 발생하기 쉽습니다.또한 환경 설정이 필요하지 않습니다.나는
timestamp
과 spotify_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 할당량에 유의).상술한 해결 방안은 곡에 대한 최종 목표를 충족시키기 위해 (정규 표현식 변경을 통해) 또는 확장 (스크립트를 통해) 하기 쉽다.
Reference
이 문제에 관하여(픽셀 재생 중 기록 내보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gcc42/exporting-your-pixel-now-playing-history-2ad1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)