vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Превратил жуткую свалку fb2 и epub-файлов, в которой мог разобраться только FBReader, да и то не сразу, в более-менее структуруированное хранилище,
вида перваябуква/автор/название

Была еще идея насоздавать симлинков для книг с более чем одним автором, но решил пока не связываться.

Большую часть работы проделал вот такой скрипт:
for i in *.fb2.zip; do

   author="`unzip -p $i "*.fb2"| xmlstarlet sel \
     -t -m "//_:title-info/_:author[1]" \
     -v _:last-name -o "_" -v _:first-name -n
   `"
   title="`unzip -p $i "*.fb2"|  xmlstarlet sel -t \ 
        -v "//_:title-info/_:book-title" | tr ' ' '_'`"
   dir=`echo "$author"|sed 's!^\(.\)!\1/\1!'` 
   echo "$i => $dir/${title}.fb2.zip"
   [ -d "$dir" ] || mkdir -p "$dir"
   
   mv $i "$dir/${title}.fb2.zip"
done


Скрипт, конечно наколеночный и кривой. Поддержки epub пока нет, хотя смысл там примерно
 unzip -p $epub_file content.opf |
   xmlstarlet sel -N dc=http://purl.org/dc/elements/1.1/ \
   -t -v '//dc:creator[1]' -n -v //dc:title  -n
.
Ну и еще файл сканируется дважды. Но я решил что проще это делать дважды, чем
разгребаться с эскейпингом средствами xslt.

О, кстати придумал как обойтись без искейпинга. Вывод xmlstarlet который пишет автора на первой строчке, а title во второй, перенаправляем в
(read author
read title
# do what we need with author and title
)
. В результате внутри xmlstarlet нужно заэскейпить только ньюлайны.

P.S. А если для фотографий аналогичный скрипт сделать? Чтобы валить их все в кучу, чуть ли не rsync-ом, а скрипт пусть потом разгребает по датам и местам.

Date: 2017-01-22 11:04 am (UTC)
rvb: (Default)
From: [personal profile] rvb
Для фото можно еще подгребать треки (например, от GPSLogger на телефоне) и делать геопривязку. В случае поездок помогает потом разобраться, что где именно было снято.

Date: 2017-01-22 07:32 pm (UTC)
rvb: (Default)
From: [personal profile] rvb
У меня фото с зеркалки, там по очевидным причинам с геотегами никак :). Вот и соорудил скрипт - указываешь папку с фото, указываешь папку с треками, вперед, искать, что с чем сматчится.

Date: 2017-01-22 11:09 am (UTC)
dzz: Dizzy の冬 (Default)
From: [personal profile] dzz
У меня была другая задача - разгрести библиотеку (Либрусек 2010 года), отсортированную по принципу "Буква-Автор", в коллекцию под читалку, отсортированную по принципу "Буква - 4 буквы - Автор". Сделал это, замаявшись искать нужного автора в списках вида "650 на букву Б".

Питоновский скрипт, порождающий разгребалку для bash-а:


import os

SourceDir=os.getcwd()
DestDir='../%s.rearranged' % SourceDir.split('/')[-1]

taglen=4
dirsize=30

x=os.listdir('.') # Basic list

y=[]

for i in sorted(x):
    try:
        y.append((i,os.listdir(i)))
    except Exception, msg:
        pass

#for i in y:
#  print '%s: %d' % (i[0], len(i[1]))

print 'mkdir "%s"' % (DestDir.replace('"','\\"').replace("`","\\`"))

#os.mkdir(DestDir)

for i in y:
    
#    os.mkdir(DestDir+'/'+i[0])

    print ('mkdir "%s/%s"' % (DestDir.replace('"','\\"'),i[0].replace('"','\\"'))).replace("`","\\`")

    splix={}
    
    for j in sorted(i[1]):
    	tag=unicode(j).upper()[:taglen]
      	if tag not in splix.keys(): splix[tag]=[]
        splix[tag].append(j)

#    for j in splix.keys():
#   	print '%s: %d' % (j, len(splix[j]))

    # Group tags by number of entries
    
    grouper=[]
    
    grplist=[]
    grpsize=0
    
    for j in sorted(splix.keys()):
    	grpsize+=len(splix[j])
    	grplist.append(j)

	if grpsize >= dirsize:
		grouper.append([grplist,grpsize])
		grplist=[]
		grpsize=0

    if grpsize > 0: grouper.append([grplist,grpsize]) # Add tail

    for j in grouper:    
    	groupalias='%s-%s' % (sorted(j[0])[0],sorted(j[0])[-1])
#    	print '%s: %d' % (groupalias,j[1])

	print ('mkdir "%s/%s/%s"' % (DestDir.replace('"','\\"'),i[0].replace('"','\\"'),groupalias.replace('"','\\"'))).replace("`","\\`")

	for k in j[0]:
	    for l in splix[k]:
	    
	    	SrcPath=("%s/%s/%s" % (SourceDir,i[0],l)).replace('"','\\"').replace("`","\\`")
                DstPath=("%s/%s/%s" % (DestDir,i[0],groupalias)).replace('"','\\"').replace("`","\\`")
                             
    		print 'cp -r "%s" "%s"' % (SrcPath, DstPath)

	print 'echo "%s/%s/%s"' % (DestDir.replace('"','\\"'),i[0].replace('"','\\"'),groupalias.replace('"','\\"'))
    		
# - The end -



На выходе, соответственно, получается что-то вроде:

mkdir "../По авторам.rearranged/Ё"
mkdir "../По авторам.rearranged/Ё/ЁКОМ-ЁСИК"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/Ё/Ёкомидзо Сэйси" "../По авторам.rearranged/Ё/ЁКОМ-ЁСИК"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/Ё/Ёсикава Эйдзи" "../По авторам.rearranged/Ё/ЁКОМ-ЁСИК"
echo "../По авторам.rearranged/Ё/ЁКОМ-ЁСИК"
mkdir "../По авторам.rearranged/А"
mkdir "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Аарон, Кумар Сентхил" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Аарх Андрей" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/аб Хъю Дэвид, Линавивер Брэд" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Абакумов Артем" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Абаринова-Кожухова Елизавета" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Абашев Юрий" "../По авторам.rearranged/А/ААРО-АБОЯ"
cp -r "/mnt/maguro-lib/Books/+Libraries+/LibRusEc/По авторам/А/Абашели Александр" "../По авторам.rearranged/А/ААРО-АБОЯ"





Edited Date: 2017-01-22 11:20 am (UTC)

Date: 2017-01-22 08:44 pm (UTC)
dzz: Dizzy の冬 (Default)
From: [personal profile] dzz
Ну, у меня задача верификации либрусековоских архивов не стояла, зато требовалось приведение иерархии к виду, удобному для использования на ридере с большой (32-64Гб) флешкой.

Теоретически, можно дополнить поиском fb2 и других фоматов в архивах по дереву с извлечением метаданных и переименованием исходных файлов. Можно даже в базу всё это хозяйство втянуть для сокращения числа проходов.
Но лень :)

Я обычно книги упорядочиваю по мере поступления (давняя привычка класть сразу на правильное место), а в случае стягивания целиковых библиотек подход с "подразбиением" по нескольким первым буквам работает неплохо.
Edited Date: 2017-01-22 08:45 pm (UTC)

Date: 2017-01-22 12:58 pm (UTC)
morthan2006: (Default)
From: [personal profile] morthan2006
По фотографиям я делал что-то вот такое: http://morthan2006.dreamwidth.org/142730.html

Date: 2017-01-22 03:40 pm (UTC)
morthan2006: (Default)
From: [personal profile] morthan2006
Конечно, много. Но чтобы было поменьше, скрипт надо было допиливать, а для одноразовой поделки это излишество.

В далёком 2009-м году мне было настолько лень читать документацию к готовым модулям, что проще уж реализовать всё самому.

А указывать ссылку на pypi я тогда считал неправильным и сейчас тоже так считаю. Ссылка на pypi подразумевает наличие интернета, которого может и не быть. Или модуля на pypi тоже может не быть по каким-то причинам. Может, со временем я и поменяю своё мнение по этому поводу, но покамест наличие пакетов в репозиториях, роликов на ютубе и картинок на хостингах не гарантируется. :-(

Date: 2017-01-22 07:54 pm (UTC)
ext_1480035: (Default)
From: [identity profile] self-perfection.ya.ru
Была еще идея насоздавать симлинков для книг с более чем одним автором, но решил пока не связываться.

Народ для доступа средствами файловой системы к подмножествам набора файлов, выбранным по различным критериям метаданных, пилит штуку под названием tagsistant. На мой вкус вещь странная, и я не придумал, где мне было бы удобно её использовать, но оцениваю шанс что вам понравится в 30%

Как минимум можно будет видеть одну и ту же книгу в директориях .../store/Автор1 и .../store/Автор2 можно будет без ручного создания симлинков, если прикрутить к tagsistant извлечение из fb2 файлов метаданных (AFAIK, пока поддерживает только аудиофайлы и изображения)

Date: 2017-01-22 08:34 pm (UTC)
ext_1480035: (Default)
From: [identity profile] self-perfection.ya.ru
Пример, который на симлинках было бы решить трудно: хотим книги, среди авторов которых есть Автор1, но отсутствует Автор2.

Средствами tagsistant это делалось бы примерно так:
ls "$TAGSISTANT_ROOT/Автор1/-/Автор2/@/"

tagsistant даёт куда больше гибкости. Цена за эту гибкость - установка и изучение странной херни. Мне эта цена показалась существенно выше выгоды, я не использую. После вашего ответа я почти уверился, что вам тоже не захочется.

Но некоторое восхищение людьми, которые пытаются упихнуть неупихуемое в стандартные интерфейсы всё же у меня есть.

Date: 2017-01-23 09:50 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
В пределе такие юзкейсы ведут к мечтам об онтологиях, семантическом вебе и RDF.

Date: 2017-01-23 09:12 am (UTC)
ext_1262629: (Default)
From: [identity profile] cats-shadow.cats-home.net
Подстава ещё в том, что одного и того же автора могут по-разному записать. И вот тут раскладка по каталогам имени автора даст энное количество "веток".
Натолкнулись в своё время, когда пробовали каталог для семейной библиотеки написать. Особо это с переводными книгами заметно (того же Желязны как не переводили).
Вот как бы такое автоматизировать...

Date: 2017-01-23 09:57 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
Это надо не автоматизировать, а краудсорсить.

Date: 2017-01-23 10:04 am (UTC)
ext_1262629: (Default)
From: [identity profile] cats-shadow.cats-home.net
В плане, что сообща править данные в библиотеках сетевых? :)
Речь идёт же о персональном хламовнике надо домашнем сервер. Какой тут краудсорс?

Date: 2017-01-23 10:27 am (UTC)
ext_1262629: (Default)
From: [identity profile] cats-shadow.cats-home.net
Ага. Тут то и спровоцируется "война правок". Как в Wiki.
Для той же флибусты это не вариант, IMHO.
(screened comment)

Date: 2017-01-23 11:11 am (UTC)
ext_1262629: (Default)
From: [identity profile] cats-shadow.cats-home.net
>Всегда можно залить несколько вариантов,соответсвующих разным изданиям, разным переводам etc.
Угу. Можно. Но смысл? Только умножение сущностей. Одно дело, когда это в на флибусте. И другое, когда в личной библиотеке, где скрипт прошёлся и наплодил авторов из одного, потому что разное количество пробелов между именем и фамилией, или символ не из той раскладки затесался.
Вот как раз думаю над тем, как сделать автоматическое сведение и исправление. По сути -- поиск похожего в авторах/названиях. Или вводить поле "оригинальное имя автора на его родном языке" и сортировать по нему.

Date: 2017-01-23 01:36 pm (UTC)
ext_1262629: (Default)
From: [identity profile] cats-shadow.cats-home.net
Тут скорее важен идентификатор, к которому можно привязаться. Чтоб разложить по каталогам свалку автоматически.

Иначе - действительно базу данных делать, чтоб выяснить, что "это не муж и жена, а три разных человека". Потому что ещё и однофамильцы и полные тёзки встречаются.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

July 2025

S M T W T F S
  12345
6789 1011 12
13141516 171819
20212223242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 17th, 2025 07:26 pm
Powered by Dreamwidth Studios