mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-20 14:06:09 +05:00
refactor
This commit is contained in:
@@ -2,6 +2,7 @@ import styled, { css } from 'styled-components'
|
|||||||
|
|
||||||
export const DialogContentGrid = styled.div`
|
export const DialogContentGrid = styled.div`
|
||||||
display: grid;
|
display: grid;
|
||||||
|
overflow: auto;
|
||||||
grid-template-columns: 70% 1fr;
|
grid-template-columns: 70% 1fr;
|
||||||
grid-template-rows: repeat(2, min-content);
|
grid-template-rows: repeat(2, min-content);
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
@@ -91,6 +92,8 @@ export const SectionHeader = styled.div`
|
|||||||
|
|
||||||
export const DetailedTorrentCacheViewWrapper = styled.div`
|
export const DetailedTorrentCacheViewWrapper = styled.div`
|
||||||
padding-top: 50px;
|
padding-top: 50px;
|
||||||
|
overflow: auto;
|
||||||
|
min-height: 80vh;
|
||||||
`
|
`
|
||||||
|
|
||||||
export const StatisticsWrapper = styled.div`
|
export const StatisticsWrapper = styled.div`
|
||||||
|
|||||||
@@ -1,254 +0,0 @@
|
|||||||
import { useEffect, useState } from 'react'
|
|
||||||
import Typography from '@material-ui/core/Typography'
|
|
||||||
import { Button, ButtonGroup, Grid, List, ListItem } from '@material-ui/core'
|
|
||||||
import CachedIcon from '@material-ui/icons/Cached'
|
|
||||||
import LinearProgress from '@material-ui/core/LinearProgress'
|
|
||||||
import DialogTitle from '@material-ui/core/DialogTitle'
|
|
||||||
import DialogContent from '@material-ui/core/DialogContent'
|
|
||||||
import { getPeerString, humanizeSize } from 'utils/Utils'
|
|
||||||
import { playlistTorrHost, streamHost, viewedHost } from 'utils/Hosts'
|
|
||||||
|
|
||||||
const style = {
|
|
||||||
width100: {
|
|
||||||
width: '100%',
|
|
||||||
},
|
|
||||||
width80: {
|
|
||||||
width: '80%',
|
|
||||||
},
|
|
||||||
poster: {
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'row',
|
|
||||||
borderRadius: '5px',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function DialogTorrentInfo({ torrent, open }) {
|
|
||||||
const [torrentLocalComponentValue, setTorrentLocalComponentValue] = useState(torrent)
|
|
||||||
const [viewed, setViewed] = useState(null)
|
|
||||||
const [progress, setProgress] = useState(-1)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setTorrentLocalComponentValue(torrent)
|
|
||||||
if (torrentLocalComponentValue.stat === 2)
|
|
||||||
setProgress((torrentLocalComponentValue.preloaded_bytes * 100) / torrentLocalComponentValue.preload_size)
|
|
||||||
getViewed(torrent.hash, list => {
|
|
||||||
if (list) {
|
|
||||||
const lst = list.map(itm => itm.file_index)
|
|
||||||
setViewed(lst)
|
|
||||||
} else setViewed(null)
|
|
||||||
})
|
|
||||||
}, [torrent, open])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<DialogTitle id='form-dialog-title'>
|
|
||||||
<Grid container spacing={1}>
|
|
||||||
<Grid item>
|
|
||||||
{torrentLocalComponentValue.poster && (
|
|
||||||
<img alt='' height='200' align='left' style={style.poster} src={torrentLocalComponentValue.poster} />
|
|
||||||
)}
|
|
||||||
</Grid>
|
|
||||||
<Grid style={style.width80} item>
|
|
||||||
{torrentLocalComponentValue.title}{' '}
|
|
||||||
{torrentLocalComponentValue.name &&
|
|
||||||
torrentLocalComponentValue.name !== torrentLocalComponentValue.title &&
|
|
||||||
` | ${torrentLocalComponentValue.name}`}
|
|
||||||
<Typography>
|
|
||||||
<b>Peers: </b> {getPeerString(torrentLocalComponentValue)}
|
|
||||||
<br />
|
|
||||||
<b>Loaded: </b> {getPreload(torrentLocalComponentValue)}
|
|
||||||
<br />
|
|
||||||
<b>Speed: </b> {humanizeSize(torrentLocalComponentValue.download_speed)}
|
|
||||||
<br />
|
|
||||||
<b>Status: </b> {torrentLocalComponentValue.stat_string}
|
|
||||||
<br />
|
|
||||||
</Typography>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
{torrentLocalComponentValue.stat === 2 && (
|
|
||||||
<LinearProgress style={{ marginTop: '10px' }} variant='determinate' value={progress} />
|
|
||||||
)}
|
|
||||||
</DialogTitle>
|
|
||||||
|
|
||||||
<DialogContent>
|
|
||||||
<List>
|
|
||||||
<ListItem key='TorrentMenu'>
|
|
||||||
<ButtonGroup
|
|
||||||
style={style.width100}
|
|
||||||
variant='contained'
|
|
||||||
color='primary'
|
|
||||||
aria-label='contained primary button group'
|
|
||||||
>
|
|
||||||
<Button
|
|
||||||
style={style.width100}
|
|
||||||
href={`${playlistTorrHost()}/${encodeURIComponent(
|
|
||||||
torrentLocalComponentValue.name || torrentLocalComponentValue.title || 'file',
|
|
||||||
)}.m3u?link=${torrentLocalComponentValue.hash}&m3u`}
|
|
||||||
>
|
|
||||||
Playlist
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
style={style.width100}
|
|
||||||
href={`${playlistTorrHost()}/${encodeURIComponent(
|
|
||||||
torrentLocalComponentValue.name || torrentLocalComponentValue.title || 'file',
|
|
||||||
)}.m3u?link=${torrentLocalComponentValue.hash}&m3u&fromlast`}
|
|
||||||
>
|
|
||||||
Playlist after last view
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
style={style.width100}
|
|
||||||
onClick={() => {
|
|
||||||
remViews(torrentLocalComponentValue.hash)
|
|
||||||
setViewed(null)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Remove views
|
|
||||||
</Button>
|
|
||||||
</ButtonGroup>
|
|
||||||
</ListItem>
|
|
||||||
|
|
||||||
{getPlayableFile(torrentLocalComponentValue) &&
|
|
||||||
getPlayableFile(torrentLocalComponentValue).map(file => (
|
|
||||||
<ButtonGroup key={file.id} style={style.width100} disableElevation variant='contained' color='primary'>
|
|
||||||
<Button
|
|
||||||
style={style.width100}
|
|
||||||
href={`${streamHost()}/${encodeURIComponent(file.path.split('\\').pop().split('/').pop())}?link=${
|
|
||||||
torrentLocalComponentValue.hash
|
|
||||||
}&index=${file.id}&play`}
|
|
||||||
>
|
|
||||||
<Typography>
|
|
||||||
{file.path.split('\\').pop().split('/').pop()} | {humanizeSize(file.length)}{' '}
|
|
||||||
{viewed && viewed.indexOf(file.id) !== -1 && '| ✓'}
|
|
||||||
</Typography>
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
onClick={() =>
|
|
||||||
fetch(`${streamHost()}?link=${torrentLocalComponentValue.hash}&index=${file.id}&preload`)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{/* <CachedIcon /> */}
|
|
||||||
<Typography>Preload</Typography>
|
|
||||||
</Button>
|
|
||||||
</ButtonGroup>
|
|
||||||
))}
|
|
||||||
</List>
|
|
||||||
</DialogContent>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function remViews(hash) {
|
|
||||||
try {
|
|
||||||
if (hash)
|
|
||||||
fetch(viewedHost(), {
|
|
||||||
method: 'post',
|
|
||||||
body: JSON.stringify({ action: 'rem', hash, file_index: -1 }),
|
|
||||||
headers: {
|
|
||||||
Accept: 'application/json, text/plain, */*',
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getViewed(hash, callback) {
|
|
||||||
try {
|
|
||||||
fetch(viewedHost(), {
|
|
||||||
method: 'post',
|
|
||||||
body: JSON.stringify({ action: 'list', hash }),
|
|
||||||
headers: {
|
|
||||||
Accept: 'application/json, text/plain, */*',
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then(res => res.json())
|
|
||||||
.then(callback)
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPlayableFile(torrent) {
|
|
||||||
if (!torrent || !torrent.file_stats) return null
|
|
||||||
return torrent.file_stats.filter(file => extPlayable.includes(getExt(file.path)))
|
|
||||||
}
|
|
||||||
|
|
||||||
function getExt(filename) {
|
|
||||||
const ext = filename.split('.').pop()
|
|
||||||
if (ext === filename) return ''
|
|
||||||
return ext.toLowerCase()
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPreload(torrent) {
|
|
||||||
if (torrent.preloaded_bytes > 0 && torrent.preload_size > 0 && torrent.preloaded_bytes < torrent.preload_size) {
|
|
||||||
const progress = ((torrent.preloaded_bytes * 100) / torrent.preload_size).toFixed(2)
|
|
||||||
return `${humanizeSize(torrent.preloaded_bytes)} / ${humanizeSize(torrent.preload_size)} ${progress}%`
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!torrent.preloaded_bytes) return humanizeSize(0)
|
|
||||||
|
|
||||||
return humanizeSize(torrent.preloaded_bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
const extPlayable = [
|
|
||||||
// video
|
|
||||||
'3g2',
|
|
||||||
'3gp',
|
|
||||||
'aaf',
|
|
||||||
'asf',
|
|
||||||
'avchd',
|
|
||||||
'avi',
|
|
||||||
'drc',
|
|
||||||
'flv',
|
|
||||||
'iso',
|
|
||||||
'm2v',
|
|
||||||
'm2ts',
|
|
||||||
'm4p',
|
|
||||||
'm4v',
|
|
||||||
'mkv',
|
|
||||||
'mng',
|
|
||||||
'mov',
|
|
||||||
'mp2',
|
|
||||||
'mp4',
|
|
||||||
'mpe',
|
|
||||||
'mpeg',
|
|
||||||
'mpg',
|
|
||||||
'mpv',
|
|
||||||
'mxf',
|
|
||||||
'nsv',
|
|
||||||
'ogg',
|
|
||||||
'ogv',
|
|
||||||
'ts',
|
|
||||||
'qt',
|
|
||||||
'rm',
|
|
||||||
'rmvb',
|
|
||||||
'roq',
|
|
||||||
'svi',
|
|
||||||
'vob',
|
|
||||||
'webm',
|
|
||||||
'wmv',
|
|
||||||
'yuv',
|
|
||||||
// audio
|
|
||||||
'aac',
|
|
||||||
'aiff',
|
|
||||||
'ape',
|
|
||||||
'au',
|
|
||||||
'flac',
|
|
||||||
'gsm',
|
|
||||||
'it',
|
|
||||||
'm3u',
|
|
||||||
'm4a',
|
|
||||||
'mid',
|
|
||||||
'mod',
|
|
||||||
'mp3',
|
|
||||||
'mpa',
|
|
||||||
'pls',
|
|
||||||
'ra',
|
|
||||||
's3m',
|
|
||||||
'sid',
|
|
||||||
'wav',
|
|
||||||
'wma',
|
|
||||||
'xm',
|
|
||||||
]
|
|
||||||
Reference in New Issue
Block a user