Как получить элементы списка для чтения в виде ссылок

У меня всего миллиард элементов в списке чтения Safari, и мне нужны ссылки на все из них.

Есть ли способ получить все элементы в вашем списке для чтения в виде ссылок (возможно, в текстовом документе)?

Является ли файл plist «список чтения» таким же, как файл plist «закладок»?
Записи списка для чтения хранятся в файле закладок, так что да (вроде).

Ответы (3)

Я набросал скрипт Python, чтобы прочитать файл plist, на который есть ссылка в вопросе, упомянутом в комментариях .

#!/usr/bin/env python
import plistlib
from shutil import copy
import subprocess
import os
from tempfile import gettempdir
import sys
import atexit

BOOKMARKS_PLIST = '~/Library/Safari/Bookmarks.plist'
bookmarksFile = os.path.expanduser(BOOKMARKS_PLIST)

# Make a copy of the bookmarks and convert it from a binary plist to text
tempDirectory = gettempdir()
copy(bookmarksFile, tempDirectory)
bookmarksFileCopy = os.path.join(tempDirectory, os.path.basename(bookmarksFile))

def removeTempFile():
    os.remove(bookmarksFileCopy)

atexit.register(removeTempFile) # Delete the temp file when the script finishes

converted = subprocess.call(['plutil', '-convert', 'xml1', bookmarksFileCopy])

if converted != 0:
    print "Couldn't convert bookmarks plist from xml format"
    sys.exit(converted)

plist = plistlib.readPlist(bookmarksFileCopy)
 # There should only be one Reading List item, so take the first one
readingList = [item for item in plist['Children'] if 'Title' in item and item['Title'] == 'com.apple.ReadingList'][0]

if 'Children' in readingList:
    for item in readingList['Children']:
        print item['URLString']

Скопируйте и вставьте это в файл, назовите его что-то вроде readinglisturls.py. Затем сделайте его исполняемым, запустив chmod +x readinglisturls.pyв Терминале. Затем вы можете запустить его в терминале, и он распечатает любые URL-адреса списка чтения. Если вам нужны URL-адреса в файле, вы можете перенаправить вывод в файл, запустив /path/to/readinglisturls.py > myfile.txtв Терминале.

Этот скрипт также доступен в виде Gist на Github, если это кому-нибудь пригодится: gist.github.com/robmathers/5995026 .

Другой вариант с использованием драгоценного камня plist Ruby:

sudo gem install plist;plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist|ruby -rubygems -e 'require "plist";puts Plist.parse_xml(STDIN.read)["Children"].select{|e|e["Title"]=="com.apple.ReadingList"}[0]["Children"].map{|e|e["URLString"]}'

Или, если у вас нет других закладок:

defaults read ~/Library/Safari/Bookmarks.plist | sed -En 's/^ *URLString = "(.*)";/\1/p'

Вот версия, использующая язык программирования Factor , которая немного проще, чем версия Python, на которую уже ответили в этом посте:

: reading-list ( -- urls )
    "~/Library/Safari/Bookmarks.plist" read-plist
    "Children" of [ "Title" of "com.apple.ReadingList" = ] find nip
    "Children" of [ "URLString" of ] map ;

Более подробная информация доступна в этом сообщении в блоге .