Fix #443
This commit is contained in:
parent
9801258b1c
commit
74dfcbaa58
3 changed files with 72 additions and 9 deletions
|
|
@ -332,7 +332,7 @@ watch(() => socket.isConnected, async () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const handleClick = (item: FileItem): void => {
|
const handleClick = (item: FileItem): void => {
|
||||||
if ('video' === item.content_type) {
|
if (true === ['video','audio'].includes(item.content_type)) {
|
||||||
model_item.value = {
|
model_item.value = {
|
||||||
"type": 'video',
|
"type": 'video',
|
||||||
"filename": item.path,
|
"filename": item.path,
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,6 @@ const makePagination = (current: number, last: number, delta: number = 5): Array
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Safely encode a path string for use in a URL.
|
* Safely encode a path string for use in a URL.
|
||||||
* Will manually encode '#' and ensure valid URI segments.
|
|
||||||
*
|
*
|
||||||
* @param item - The input path string.
|
* @param item - The input path string.
|
||||||
* @returns The URL-encoded path.
|
* @returns The URL-encoded path.
|
||||||
|
|
@ -189,14 +188,37 @@ const encodePath = (item: string): string => {
|
||||||
return item
|
return item
|
||||||
}
|
}
|
||||||
|
|
||||||
item = item.replace(/#/g, '%23')
|
return item.split('/').map(segment => {
|
||||||
|
try {
|
||||||
|
const decoded = decodeURIComponent(segment)
|
||||||
|
const reEncoded = encodeURIComponent(decoded)
|
||||||
|
|
||||||
try {
|
if (reEncoded === segment) {
|
||||||
return item.split('/').map(decodeURIComponent).map(encodeURIComponent).join('/')
|
return segment
|
||||||
} catch (e) {
|
}
|
||||||
console.error('Error encoding path:', e, item)
|
} catch {
|
||||||
return item
|
// Decoding failed, segment has invalid encoding
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const placeholders: string[] = []
|
||||||
|
const _PREFIX = `_YTP${Math.random().toString(36).substring(2, 8).toUpperCase()}_`
|
||||||
|
const _SUFFIX = `_YTP${Math.random().toString(36).substring(2, 8).toUpperCase()}_`
|
||||||
|
|
||||||
|
let processed = segment.replace(/%[0-9A-Fa-f]{2}/g, match => {
|
||||||
|
const index = placeholders.length
|
||||||
|
placeholders.push(match)
|
||||||
|
return `${_PREFIX}${index}${_SUFFIX}`
|
||||||
|
})
|
||||||
|
|
||||||
|
processed = encodeURIComponent(processed)
|
||||||
|
|
||||||
|
const placeholderRegex = new RegExp(`${_PREFIX.replace(/_/g, '_')}(\\d+)${_SUFFIX.replace(/_/g, '_')}`, 'g')
|
||||||
|
processed = processed.replace(placeholderRegex, (_match, index: string) => {
|
||||||
|
return placeholders[parseInt(index)] || ''
|
||||||
|
})
|
||||||
|
|
||||||
|
return processed
|
||||||
|
}).join('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -279,6 +279,47 @@ describe('string manipulation helpers', () => {
|
||||||
expect(utils.encodePath('folder#1/video name.mp4')).toBe('folder%231/video%20name.mp4')
|
expect(utils.encodePath('folder#1/video name.mp4')).toBe('folder%231/video%20name.mp4')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('encodePath handles % character correctly', () => {
|
||||||
|
// This is the edge case reported in the bug
|
||||||
|
expect(utils.encodePath('How to enjoy Shin Ramyun 100%.opus')).toBe('How%20to%20enjoy%20Shin%20Ramyun%20100%25.opus')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles multiple special characters', () => {
|
||||||
|
expect(utils.encodePath('100% complete [HD] #1.mp4')).toBe('100%25%20complete%20%5BHD%5D%20%231.mp4')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles paths with % character', () => {
|
||||||
|
expect(utils.encodePath('folder/How to enjoy Shin Ramyun 100%.opus')).toBe('folder/How%20to%20enjoy%20Shin%20Ramyun%20100%25.opus')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles already encoded strings', () => {
|
||||||
|
expect(utils.encodePath('How%20to%20enjoy%20Shin%20Ramyun%20100%25.opus')).toBe('How%20to%20enjoy%20Shin%20Ramyun%20100%25.opus')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles mixed encoded and unencoded', () => {
|
||||||
|
expect(utils.encodePath('folder/file%20name 100%.mp4')).toBe('folder/file%20name%20100%25.mp4')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles special characters &, =, ?', () => {
|
||||||
|
expect(utils.encodePath('query?param=value&key=100%.mp4')).toBe('query%3Fparam%3Dvalue%26key%3D100%25.mp4')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles empty string', () => {
|
||||||
|
expect(utils.encodePath('')).toBe('')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles simple filename', () => {
|
||||||
|
expect(utils.encodePath('video.mp4')).toBe('video.mp4')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles unicode characters', () => {
|
||||||
|
expect(utils.encodePath('视频文件.mp4')).toBe('%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6.mp4')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('encodePath handles parentheses', () => {
|
||||||
|
expect(utils.encodePath('video (1080p).mp4')).toBe('video%20(1080p).mp4')
|
||||||
|
})
|
||||||
|
|
||||||
it('removeANSIColors strips escape codes', () => {
|
it('removeANSIColors strips escape codes', () => {
|
||||||
const sample = '\u001b[31mError\u001b[0m'
|
const sample = '\u001b[31mError\u001b[0m'
|
||||||
expect(utils.removeANSIColors(sample)).toBe('Error')
|
expect(utils.removeANSIColors(sample)).toBe('Error')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue