'use strict'; const all_stop_btn = document.getElementById('all_stop_btn'); const list_tbody = document.getElementById('list_tbody'); // 소켓 const socket = io.connect(`${location.origin}/${package_name}`); socket.on('add', (data) => { list_tbody.innerHTML += make_item(data); }); socket.on('status', (data) => { status_html(data); }); // 목록 불러오기 fetch(`/${package_name}/ajax/list`, { method: 'POST', cache: 'no-cache', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', }, }) .then((response) => response.json()) .then((data) => { let str = ''; for (const item of data) { str += make_item(item); } list_tbody.innerHTML = str; }); // 전체 중지 all_stop_btn.addEventListener('click', (event) => { event.preventDefault(); fetch(`/${package_name}/ajax/all_stop`, { method: 'POST', cache: 'no-cache', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', }, }) .then((response) => response.json()) .then(() => { location.reload(); }); }); // 중지 list_tbody.addEventListener('click', (event) => { event.preventDefault(); const target = event.target; if (!target.classList.contains('youtubeDl-stop')) { return; } fetch(`/${package_name}/ajax/stop`, { method: 'POST', cache: 'no-cache', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', }, body: new URLSearchParams({ index: target.dataset.index, }), }) .then((response) => response.json()) .then(() => { location.reload(); }); }); function make_item(data) { let str = ``; str += get_item(data); str += ''; str += ``; str += ''; str += `
`; str += get_detail(data); str += '
'; str += ''; str += ''; return str; } function get_item(data) { let str = `${data.index + 1}`; str += `${data.plugin}`; str += `${data.start_time}`; str += `${data.extractor}`; str += `${data.title}`; str += `${data.status_ko}`; let visi = 'hidden'; if (parseInt(data.percent) > 0 && data.status_str !== 'STOP') { visi = 'visible'; } str += `
${data.percent}%
`; str += `${data.download_time}`; str += ''; if ( data.status_str === 'START' || data.status_str === 'DOWNLOADING' || data.status_str === 'FINISHED' ) { str += ``; } str += ''; return str; } function get_detail(data) { let str = info_html('URL', data.url, data.url); str += info_html('업로더', data.uploader, data.uploader_url); str += info_html('임시폴더', data.temp_path); str += info_html('저장폴더', data.save_path); str += info_html('종료시간', data.end_time); if (data.status_str === 'DOWNLOADING') { str += info_html('', '현재 다운로드 중인 파일에 대한 정보'); str += info_html('파일명', data.filename); str += info_html( '진행률(current/total)', `${data.percent}% (${data.downloaded_bytes_str} / ${data.total_bytes_str})` ); str += info_html('남은 시간', `${data.eta}초`); str += info_html('다운 속도', data.speed_str); } return str; } function info_html(left, right, option) { let str = '
'; const link = left === 'URL' || left === '업로더'; str += '
'; str += `${left}`; str += '
'; str += '
'; str += '
'; str += ''; if (link) { str += ``; } str += right; if (link) { str += ''; } str += '
'; return str; } function status_html(data) { document.getElementById(`item_${data.index}`).innerHTML = get_item(data); document.getElementById(`detail_${data.index}`).innerHTML = get_detail(data); }