Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle duplicated filename #90

Open
eight04 opened this issue Jan 20, 2018 · 7 comments
Open

Handle duplicated filename #90

eight04 opened this issue Jan 20, 2018 · 7 comments

Comments

@eight04
Copy link
Owner

eight04 commented Jan 20, 2018

URL: https://exhentai.org/g/323260/f04af39a6a/
Setting:

originalfilename = True

Page 246 would overwrite page 11:

@eight04 eight04 mentioned this issue Jan 20, 2018
@eight04
Copy link
Owner Author

eight04 commented Jan 29, 2018

這問題有點難解。

  1. 下載至 11 頁,此時資料夾內有檔案 image_1.jpg
  2. 下載至 245 頁,重開 ComicCrawler
  3. 繼續下載 246 頁。ComicCrawler 判斷 image_1.jpg 已存在,隨即跳過這頁。
  • ComicCrawler 的存檔中沒有任何資訊紀錄 image_1.jpg 這個檔案是由哪一頁提供的。
  • 在未使用 originalfilename 的選項時,由於檔名都以頁數命名,image_001.jpg 就可以確定是第一頁提供的,若重新下載第一頁,跳過該頁數是安全的。
  • 使用 originalfilename 的選項,並且保證檔名不重覆的情況下,若有同名的檔案已在資料夾中,跳過也是安全的。
  • 使用 originalfilename 的選項,並且檔名重覆的情況下,若遇到同檔名的即自動重新命名,則重覆下載相同圖片時也不會被跳過。

有一個辦法,就是將檔案下載下來後,比對本地的檔案,檢查內容是否相同,若相同就不存檔。但這樣一來,所有的檔案都要下載一遍,大大增加流量並減慢下載速度。最糟的情況是所有檔名都相同,每頁都要和所有檔案都比對一次。

先在 README 內補上警告訊息。

@chihan3ting

@eight04
Copy link
Owner Author

eight04 commented Jan 29, 2018

我想比較好的方法是

  • 刪除 originalfilename 選項
  • 增加 appendoriginalfilename 選項。設成 True 時可以將原檔名 在頁數後 (e.g. image_001_1.jpg, image_246_1.jpg),如此一來就能同時保存頁數資訊和原檔名。

@eight04
Copy link
Owner Author

eight04 commented Jan 29, 2018

或者把頁數接在原檔名後

@chihan3ting
Copy link

chihan3ting commented Feb 18, 2018

嗯!個人見解,保留originalfilename。一般紳士抓圖在意的是圖片順序和原檔名,畢竟同個資源抓放在同個文檔夾,便於閱讀。而非保存頁數資訊 (e.g. image_001_1.jpg, image_246_1.jpg),那個過於畫蛇添足。

遇到同檔名的可以跳出提示,讓使用者設置originalfilename為False,雖然原檔名在這種情況下無意義,畢竟閱讀順序優先於保存原檔名。

檔名可以是相同的,但文件hash是唯一的。關於這個問題我個人對於comiccrawler的理想狀態是帶有檢驗機制的,遇到同檔名的就進行hash校驗,確定同一個文件(image_001.jpg)就跳過,同檔名但不同文件的就用image_001_1.jpg保存下來。嗯,不好意思,說著說著又回到原來的問題。

我個人認為comiccrawler是如今最靈活便利的抓圖軟體工具,這個問題如果沒有較好的解決方案,就暫時擱下比較好!關於同檔名的,就在readme重點說明,讓個人可以選擇使用是否保留原檔名,originalfilename是False,還是True,在告知使用者情況下,紳士們應該會自行選擇的。

另,最近忙,晚回信息,實在抱歉!

台灣地震,作者可安好?天佑台灣!祈福!

@eight04
Copy link
Owner Author

eight04 commented Feb 19, 2018

遇到同檔名的可以跳出提示
檔名可以是相同的,但文件hash是唯一的。關於這個問題我個人對於comiccrawler的理想狀態是帶有檢驗機制的,遇到同檔名的就進行hash校驗,確定同一個文件(image_001.jpg)就跳過,同檔名但不同文件的就用image_001_1.jpg保存下來

要校驗 hash 的必須條件為先把檔案下載下來,和目前 Comic Crawler 的運作方法不同。目前的運作方法是這樣的︰

  1. 抓取集數列表
  2. 取得各集第一頁的 URL
  3. 抓取第一頁
  4. 取得圖片的 URL 和原始檔名
  5. 產生檔案名(e.g. image_001.jpg 或原檔名 image_xxx_1.jpg)
  6. 檢查檔案是否已存在資料夾內
    • 否 -> 抓取圖片,存至資料夾
  7. 抓取下一頁,回到 (4)

如果檔案已存在於資料夾內,就不須下載圖片。

若要校驗 hash︰

  1. 抓取集數列表
  2. 取得各集第一頁的 URL
  3. 抓取第一頁
  4. 取得圖片的 URL 和原始檔名
  5. 產生檔案名(e.g. image_001.jpg 或原檔名 image_xxx_1.jpg)
  6. 檢查檔案是否已存在資料夾內
    • 否 -> 抓取圖片,存至資料夾
    • 是 -> 抓取圖片,檢查 hash 是否相同
      • 否 -> 產生新檔名並回到 (6)(省略抓取圖片)
  7. 抓取下一頁,回到 (4)

無論檔案是否存在資料夾內,都必須執行下載圖片的動作。

@chihan3ting
Copy link

chihan3ting commented Feb 19, 2018

新年好!
這樣看起來hash似乎不是解決同檔名的重命名這個問題的唯一方法。這條線有點像鑽牛角尖,繞不過彎,不過ex伺服器上是如何保存同一目錄的同檔名的文件,讓人費解。

1.不過,我觀察到ex有給每個目錄下的每個文檔都給順序序號,不管檔名相同與否。比如https://exhentai.org/g/323260/f04af39a6a/
在缩列圖表上,鼠鍵移動上去Page11,會顯示Page11:1.jpg。前面的Page11是ex給同目錄下給這張圖的排序,1.jpg這是這張圖的原檔名。在Page246下則有Page246:1.jpg,同理,Page246是ex給同目錄下給另一張圖同檔名1.jpg的排序。好像ex有人工審查一般(誤),就算up主有重複命名檔上傳也能對其判斷是否是同一文檔,確認文檔唯一性,刪除同文檔(可重複命名但不能是同個文檔)。另,ex會對惡意命名或排序錯亂的畫廊直接隱藏或刪除。由此我個人設想comiccrawler在保留原檔名的前提下,根據ex給的Page xxx順序來抓圖,遇到同檔名的但序列號不同的才進行後綴重命名,比如Page11:1.jpg與Page246:1.jpg,由於Page11在先,保存Page11:1.jpg為image_1.jpg,而到了Page246:1.jpg,排序在後則保存Page246:1.jpg為image_1_01.jpg,之下同理。一句話,依序抓圖,同名後綴。

2.https://exhentai.org/g/323260/f04af39a6a/
之後,個人嘗試了其他紳士的抓圖器,偶有優點但操作有所不便,只是小刀小試,專器專用。有https://github.com/fffonion/xeHentai,
作者可以試用一下來抓前面有重檔名的ex畫廊,可能有所收穫。

以上個人見解,不當之處還請海涵!作者平安無事,甚好!

@eight04
Copy link
Owner Author

eight04 commented Feb 20, 2018

我把問題點列下來︰

  1. 同一個集數中,有相同原檔名的圖片,該如何處理
    • Comic Crawler 的存檔沒有記錄圖片的原檔名。
    • 原檔名是下載該頁後才得到的。
  2. 在本地資料夾內,圖片名稱已存在時,該如何處理
    • 目前檔案已存在的情況下會跳過該頁,詳見前面的 comment

因為 (1) 的緣故,在第 11 頁得到 1.jpg 時,不知道第 246 頁也是 1.jpg;在第 246 頁得到 1.jpg 時,不知道第 11 頁也是 1.jpg。你所提到的方法「原檔名相同時重命名」、「跳出確認視窗」等等,皆是做不到的,除非在存檔內記入檔名訊息。

理想狀態下,只要解決 (1) 的問題,(2) 的行為就可以繼續運作,不需要加入比對檔案的功能。若 (1) 解決不了,在 (2) 加入比對檔案的功能,也可以確保同名不同內容的檔案不會互相覆蓋。然而︰

  • 在存檔內加入圖片訊息會增加存檔大小。目前 Comic Crawler 只記錄了下載中的那一頁,若要記錄下載過的每一頁,存檔容量應該會大不少。
  • 要比對檔案,必須先把檔案下載回來,這會直接讓「跳過下載過的頁數」功能失效。

所以我才會在前面建議,將原檔名接在頁數後/前方的解法。如此一來不用增加存檔大小又可以記錄原檔名和頁數訊息,既能解決 (1) 又可以保持 (2) 的行為。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants