From 78d7b64149fc789d99a3185f60fa02dda794b6e6 Mon Sep 17 00:00:00 2001 From: Daniel Shleifman Date: Tue, 15 Jun 2021 21:09:57 +0300 Subject: [PATCH] added support of original title in add dialog --- web/src/components/Add/AddDialog.jsx | 21 ++++++---- web/src/components/Add/RightSideComponent.jsx | 41 ++++++++++++++++--- web/src/components/Add/helpers.js | 6 +-- web/src/locales/en/translation.json | 1 + web/src/locales/ru/translation.json | 1 + 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/web/src/components/Add/AddDialog.jsx b/web/src/components/Add/AddDialog.jsx index aa59b0b..9e3cd1c 100644 --- a/web/src/components/Add/AddDialog.jsx +++ b/web/src/components/Add/AddDialog.jsx @@ -25,6 +25,7 @@ export default function AddDialog({ const { t } = useTranslation() const [torrentSource, setTorrentSource] = useState(originalHash || '') const [title, setTitle] = useState(originalTitle || '') + const [parsedTitle, setParsedTitle] = useState('') const [posterUrl, setPosterUrl] = useState(originalPoster || '') const [isPosterUrlCorrect, setIsPosterUrlCorrect] = useState(false) const [isTorrentSourceCorrect, setIsTorrentSourceCorrect] = useState(false) @@ -85,7 +86,7 @@ export default function AddDialog({ const delayedPosterSearch = useMemo(() => debounce(posterSearch, 700), [posterSearch]) - const prevTitleState = usePreviousState(title) + const prevParsedTitleState = usePreviousState(parsedTitle) const prevTorrentSourceState = usePreviousState(torrentSource) useEffect(() => { @@ -98,27 +99,28 @@ export default function AddDialog({ setIsTorrentSourceCorrect(true) if (torrentSourceChanged) { - parseTorrentTitle(selectedFile || torrentSource, newTitle => { - if (!newTitle) return + parseTorrentTitle(selectedFile || torrentSource, ({ parsedTitle, originalName }) => { + if (!parsedTitle) return setSkipDebounce(true) - setTitle(newTitle) + setTitle(originalName) + setParsedTitle(parsedTitle) }) } }, [prevTorrentSourceState, selectedFile, torrentSource]) useEffect(() => { // if title exists and title was changed then search poster. - const titleChanged = title !== prevTitleState + const titleChanged = parsedTitle !== prevParsedTitleState if (!titleChanged) return if (skipDebounce) { - posterSearch(title, posterSearchLanguage) + posterSearch(parsedTitle, posterSearchLanguage) setSkipDebounce(false) } else { - title === '' ? removePoster() : delayedPosterSearch(title, posterSearchLanguage) + parsedTitle === '' ? removePoster() : delayedPosterSearch(parsedTitle, posterSearchLanguage) } - }, [title, prevTitleState, delayedPosterSearch, posterSearch, posterSearchLanguage, skipDebounce]) + }, [parsedTitle, prevParsedTitleState, delayedPosterSearch, posterSearch, posterSearchLanguage, skipDebounce]) const removePoster = () => { setIsPosterUrlCorrect(false) @@ -128,6 +130,7 @@ export default function AddDialog({ useEffect(() => { if (!selectedFile && !torrentSource) { setTitle('') + setParsedTitle('') setPosterList() removePoster() setIsUserInteractedWithPoster(false) @@ -186,12 +189,14 @@ export default function AddDialog({ setTitle(value) + const handleTitleChange = ({ target: { value } }) => { + setTitle(value) + setParsedTitle(value) + } const handlePosterUrlChange = ({ target: { value } }) => { setPosterUrl(value) checkImageURL(value).then(setIsPosterUrlCorrect) @@ -47,10 +53,35 @@ export default function RightSideComponent({ setIsUserInteractedWithPoster(true) } + const sourceIsHash = torrentSource.match(hashRegex) !== null + return ( - + + { + setTitle('') + setParsedTitle('') + }} + > + + + + ), + }} + /> { const newLanguage = posterSearchLanguage === 'en' ? 'ru' : 'en' setPosterSearchLanguage(newLanguage) - posterSearch(title, newLanguage, { shouldRefreshMainPoster: true }) + posterSearch(parsedTitle, newLanguage, { shouldRefreshMainPoster: true }) }} showbutton={+isPosterUrlCorrect} color='primary' diff --git a/web/src/components/Add/helpers.js b/web/src/components/Add/helpers.js index 3bb5ebe..f319786 100644 --- a/web/src/components/Add/helpers.js +++ b/web/src/components/Add/helpers.js @@ -32,14 +32,14 @@ export const checkImageURL = async url => { } const magnetRegex = /^magnet:\?xt=urn:[a-z0-9].*/i -const hashRegex = /^\b[0-9a-f]{32}\b$|^\b[0-9a-f]{40}\b$|^\b[0-9a-f]{64}\b$/i +export const hashRegex = /^\b[0-9a-f]{32}\b$|^\b[0-9a-f]{40}\b$|^\b[0-9a-f]{64}\b$/i const torrentRegex = /^.*\.(torrent)$/i export const chechTorrentSource = source => source.match(hashRegex) !== null || source.match(magnetRegex) !== null || source.match(torrentRegex) !== null export const parseTorrentTitle = (parsingSource, callback) => { parseTorrent.remote(parsingSource, (err, { name, files } = {}) => { - if (!name || err) return callback(null) + if (!name || err) return callback({ parsedTitle: null, originalName: null }) const torrentName = ptt.parse(name).title const nameOfFileInsideTorrent = files ? ptt.parse(files[0].name).title : null @@ -50,6 +50,6 @@ export const parseTorrentTitle = (parsingSource, callback) => { newTitle = torrentName.length < nameOfFileInsideTorrent.length ? torrentName : nameOfFileInsideTorrent } - callback(newTitle) + callback({ parsedTitle: newTitle, originalName: name }) }) } diff --git a/web/src/locales/en/translation.json b/web/src/locales/en/translation.json index c4465db..7264978 100644 --- a/web/src/locales/en/translation.json +++ b/web/src/locales/en/translation.json @@ -2,6 +2,7 @@ "About": "About", "Actions": "Actions", "Add": "Add", + "AddDialogTorrentTitle": "Title (empty for default torrent name)", "AddFromLink": "Add from Link", "AddNewTorrent": "Add new torrent", "AddPosterLinkInput": "Poster link", diff --git a/web/src/locales/ru/translation.json b/web/src/locales/ru/translation.json index 427d44c..b4ad1b3 100644 --- a/web/src/locales/ru/translation.json +++ b/web/src/locales/ru/translation.json @@ -2,6 +2,7 @@ "About": "О сервере", "Actions": "Действия", "Add": "Добавить", + "AddDialogTorrentTitle": "Имя (пустой для имени из торрента)", "AddFromLink": "Добавить", "AddNewTorrent": "Добавить новый торрент", "AddPosterLinkInput": "Ссылка на постер",