Что нового

Изменить теги fb2 книги

eus_deus

Новичок
Сообщения
118
Репутация
0
Привет.
Собственно, как можно изменять и сохранять теги книг? Типа серии, автора, названия...
Насколько я понял, надо использовать библиотеку _XMLDomWrapper.au3, но я не нашел на нее документации и не смог понять, как ее использовать
Чтение тегов делает скрипт, найденный на форуме. А вот как изменить?
Код:
Local Const $APP_NAME = "fb2renamer"
Local Const $APP_VERSION = "0.1"
Local Const $APP_TITLE = $APP_NAME & " v" & $APP_VERSION

Local $g_oXML

Main()

Func _ReadXMLNodeText($oXMLobj, $sNode)
    Local $result = $oXMLobj.SelectSingleNode($sNode)
    If IsObj($result) Then
        Return $result.text
    Else
        Return ""
    EndIf
EndFunc   ;==>_ReadXMLNodeText

Func _ReadXMLNodeAttrib($oXMLobj, $sNode, $sAttrib)
    Local $sXPath = $sNode & "[@" & $sAttrib & "]"
    Local $result = $oXMLobj.SelectSingleNode($sXPath)
    If IsObj($result) Then
        Return $result.getAttribute($sAttrib)
    Else
        Return ""
    EndIf
EndFunc   ;==>_ReadXMLNodeAttrib

Func _GetParentDir($sFileName)
    Return StringLeft($sFileName, StringInStr($sFileName, "\", 0, -1) - 1)
EndFunc   ;==>_GetParentDir

Func _GetFileName($sFileName)
    Return StringTrimLeft($sFileName, StringInStr($sFileName, "\", 0, -1))
EndFunc   ;==>_GetFileName

Func _GetNewName($sFile)
    If $g_oXML.load($sFile) Then
        Local $sLastName, $sMiddleName, $sFirstName, $sBookTitle, $sSequenseName, $sSequenseNumber
        Local $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/title-info")
        $sLastName = _ReadXMLNodeText($oNode, "author/last-name")
        $sMiddleName = _ReadXMLNodeText($oNode, "author/middde-name")
        $sFirstName = _ReadXMLNodeText($oNode, "author/first-name")
        $sBookTitle = _ReadXMLNodeText($oNode, "book-title")
        $sSequenseName = _ReadXMLNodeAttrib($oNode, "sequence", "name")
        $sSequenseNumber = _ReadXMLNodeAttrib($oNode, "sequence", "number")
        ; Новое имя файла:
        Local $sNewFileName = "" _
                 & $sFirstName & " " _
                 & $sMiddleName& " " _
                 & $sLastName & " - " _
                 & $sSequenseName & " - " _
                 & ($sSequenseNumber <> "" ? " - " & $sSequenseNumber & " - " : "") & " " _
                 & $sBookTitle _
                 & ".fb2"
        $sNewFileName = StringRegExpReplace($sNewFileName, "\ +", " ")
         ; Вынести настройку переименования в файл настроек
        $sNewFileName = StringReplace($sNewFileName, " - - ", " - ")        
        Return $sNewFileName
    Else
        SetError(1)  ; 1 == file not found
        Return ""
    EndIf
EndFunc   ;==>_GetNewName

Func _PickUpNewName($sFileName)
    Local $sNewName = $sFileName
    Local $iCount = 1
    While True
        If FileExists($sNewName) Then
            $sNewName = StringRegExpReplace($sNewName, " \([0-9]+\).fb2", " \(" & $iCount & "\).fb2")
            If @extended = 0 Then $sNewName = StringReplace($sNewName, ".fb2", " (" & $iCount & ").fb2")
        Else
            ExitLoop
        EndIf
        $iCount += 1
    WEnd
    Return $sNewName
EndFunc   ;==>_PickUpNewName

Func _RenameSingleFile($bTestMode, $sFileName)
    Local $sOldFullName = FileGetLongName($sFileName, 1)
    Local $sOldFileName = _GetFileName($sOldFullName)
    Local $sFolderName = _GetParentDir($sOldFullName)
    Local $sNewFileName = _GetNewName($sOldFullName)
    Local $sNewFullName = _PickUpNewName($sFolderName & "\" & $sNewFileName)
    $sNewFileName = _GetFileName($sNewFullName)
    Local $iBtn = MsgBox(4, $APP_TITLE, "" _
                 & "Папка:    " & @CRLF _
                 & $sFolderName & @CRLF & @CRLF _
                 & "Имя книги:" & @CRLF _
                 & $sOldFileName & @CRLF & @CRLF _
                 & "Новое имя: " & @CRLF _
                 & $sNewFileName & @CRLF & @CRLF _
                 & @CRLF _
                 & "Переименовать?" _
                )
        If $iBtn = 6 Then FileMove($sOldFullName, $sNewFullName)
EndFunc   ;==>_RenameSingleFile

Func _QuitWithMessage($sMessage, $iMsgBoxCode = 0, $iExitCode = 0)
    MsgBox($iMsgBoxCode, $APP_TITLE, $sMessage)
    Exit $iExitCode
EndFunc   ;==>_QuitWithMessage

Func Main()
    $g_oXML = ObjCreate("Microsoft.XMLDOM")
    If Not IsObj($g_oXML) Then _QuitWithMessage("Ошибка инициализации XML :(", 16, 1)    
    Local $bOptTestMode = True    
    $aBook = StringSplit("j:\Kattner_Sim-udostoveryaetsya.3kZ8dw.565890.fb2", '|')
    For $i = 1 To $aBook[0]
        Select
            Case FileExists($aBook[$i])
                _RenameSingleFile($bOptTestMode, $aBook[$i])                
        EndSelect
    Next
    EndFunc   ;==>Main
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Сама библиотека у меня есть, на чем бы я тренировался. Но даже получить с ее помощью хоть что то у меня не вышло, не говоря о том, чтобы изменить
Код:
#include <_XMLDomWrapper.au3>

$file = "j:\My_project_programming\Converter\test\FB2\Джеймс Хэдли Чейз - Еще один простофиля.fb2"

_Main($file)

Func _Main($f)
    Local $XML = _XMLFileOpen($f)
    Local $a = _XMLGetValue ("description/title-info/author/last-name")
MsgBox(4096,"Переменная $a","Файл test_write_tags_fb2.au3 ~~ Строка 10"&@CRLF&"$a =>"&$a&"<=")
  
EndFunc
 
Последнее редактирование:

vovsla

Осваивающий
Сообщения
607
Репутация
36
Тогда может регекспом поменять?
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Тогда может регекспом поменять?
Думаю, это рассматривать надо как последний вариант, если уже ничего другого не останется

Да уж, сложновастенько... Я не пойму, у fb2 вроде структура xml, но при этом сделать что-то не выходит...
 
Последнее редактирование:
Верх