
    ki3z                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlmZ d dlmZ  G d de	j        ej        j                  Z G d dej        j                  Z G d d	          Z G d
 de          ZdS )    N)AES)unpadc                       e Zd ZdZdS )ThreadedHTTPServerTN)__name__
__module____qualname__daemon_threads     &   /storage/emulated/0/lz/py/测试用.pyr   r      s        NNNr   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )NovelHandlerc                    t          | j        dd           }t          j                            | j                  }|j        }t          j                            |j                  }|dk    rA|r|                                 | 	                    d           | 
                                 d S |dk    r|                                  d S |dk    r|                     ||           d S |                     d           d S )Nspiderz/close   z
/read.htmlz/api/chapteri  )getattrserverurllibparseurlparsepathparse_qsqueryclose_dialogsend_responseend_headersserve_reader_uiserve_chapter_data
send_error)selfr   	path_infor   r   s        r   do_GETzNovelHandler.do_GET   s    h55L))$)44	~%%io66 8,v**,,,s###F<  """""^####FE22222OOC     r   c                     d}|                      d           |                     dd           |                                  | j                            |                    d                     d S )NuFD  
        <!DOCTYPE html>
        <html lang="zh-CN">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>阅读器</title>
            <style>
                body {
                    margin: 0; padding: 20px 16px;
                    background-color: #f8f1e3; color: #3e3e3e;
                    font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
                    line-height: 1.8; font-size: 22px;
                    word-wrap: break-word; user-select: none;
                }
                /* 右上角关闭按钮 */
                .close-btn {
                    position: fixed; top: 15px; right: 15px; width: 44px; height: 44px;
                    background: rgba(91, 70, 54, 0.6); color: #f8f1e3; border-radius: 50%;
                    display: flex; align-items: center; justify-content: center;
                    font-size: 30px; z-index: 10001; border: none; font-weight: bold;
                }
                /* 朗读控制按钮 */
                .tts-controls {
                    position: fixed; top: 70px; right: 15px;
                    display: flex; gap: 8px; z-index: 10000;
                }
                .tts-btn {
                    background: rgba(91, 70, 54, 0.8); color: #f8f1e3;
                    border: none; border-radius: 20px; padding: 10px 15px;
                    font-size: 14px; cursor: pointer; min-width: 60px;
                    transition: all 0.2s;
                }
                .tts-btn:hover {
                    background: rgba(91, 70, 54, 0.9);
                    transform: translateY(-2px);
                }
                .tts-btn:active {
                    transform: translateY(0);
                }
                .tts-btn.active {
                    background: rgba(139, 92, 70, 0.9);
                    box-shadow: 0 0 10px rgba(139, 92, 70, 0.5);
                }
                .tts-btn:disabled {
                    background: rgba(140, 123, 117, 0.5);
                    cursor: not-allowed;
                }
                /* 朗读段落反白样式 */
                .reading-active {
                    background-color: #5b4636 !important;
                    color: #f8f1e3 !important;
                    border-radius: 4px;
                }
                #content-wrapper { padding-bottom: 80px; }
                .chapter-section { margin-bottom: 40px; }
                h2 { 
                    color: #5b4636; border-bottom: 2px solid #8c7b75; 
                    text-align: center; margin-top: 30px; padding-bottom: 10px;
                }
                p { 
                    margin-bottom: 1.2em; text-indent: 2em; padding: 12px 8px; 
                    transition: background 0.2s; cursor: pointer;
                    border-radius: 6px;
                }
                p:hover { background-color: rgba(91, 70, 54, 0.15); }
                .status-bar {
                    position: fixed; bottom: 0; left: 0; right: 0;
                    background: rgba(248, 241, 227, 0.95); padding: 10px 15px;
                    display: flex; justify-content: space-between;
                    font-size: 14px; color: #8c7b75; border-top: 1px solid #d1c7b7; z-index: 1000;
                }
                #loading-tip { text-align: center; padding: 20px; color: #8c7b75; display: none; }
            </style>
        </head>
        <body>
            <button class="close-btn" onclick="closeWindow()">×</button>
            
            <div class="tts-controls">
                <button class="tts-btn" id="test-tts-btn" onclick="testTTS()">测试TTS</button>
                <button class="tts-btn" id="start-tts-btn" onclick="startReading()" disabled>朗读</button>
                <button class="tts-btn" id="pause-tts-btn" onclick="togglePause()" disabled>暂停</button>
                <button class="tts-btn" id="stop-tts-btn" onclick="stopReading()" disabled>停止</button>
            </div>
            
            <div id="content-wrapper"></div>
            <div id="loading-tip">正在加载下一章...</div>
            <div class="status-bar">
                <span id="p-info">初始化中...</span>
                <span id="t-info">点击段落测试朗读</span>
            </div>
            <script>
                const params = new URLSearchParams(window.location.search);
                const bid = params.get('bid');
                let currentIdx = parseInt(params.get('idx') || '0');
                let loading = false, isEnd = false;
                let currentParagraph = null;
                
                // TTS 相关变量
                let speechSynthesis = window.speechSynthesis;
                let currentUtterance = null;
                let isSpeaking = false;
                let isPaused = false;
                let ttsAvailable = false;
                
                function log(msg) {
                    console.log('[READER] ' + msg);
                    document.getElementById('t-info').innerText = msg;
                }

                function closeWindow() {
                    // 停止朗读
                    stopReading();
                    
                    // 通知服务器关闭弹窗
                    fetch('/close').then(() => { 
                        window.location.href = "about:blank"; 
                    });
                }

                // 检查TTS可用性
                function checkTTSAvailability() {
                    if (!speechSynthesis) {
                        log('浏览器不支持Web Speech API');
                        ttsAvailable = false;
                        return false;
                    }
                    
                    // 获取可用语音列表
                    let voices = speechSynthesis.getVoices();
                    
                    // 如果语音列表为空，等待voiceschanged事件
                    if (voices.length === 0) {
                        log('加载语音列表中...');
                        speechSynthesis.onvoiceschanged = function() {
                            voices = speechSynthesis.getVoices();
                            setupTTS(voices);
                        };
                    } else {
                        setupTTS(voices);
                    }
                    
                    return true;
                }
                
                function setupTTS(voices) {
                    if (voices.length === 0) {
                        log('未找到可用语音，TTS可能不可用');
                        ttsAvailable = false;
                        return;
                    }
                    
                    // 查找中文语音
                    const chineseVoices = voices.filter(voice => 
                        voice.lang.startsWith('zh') || 
                        voice.lang.includes('CN') || 
                        voice.lang.includes('CHN')
                    );
                    
                    if (chineseVoices.length > 0) {
                        log(`找到 ${chineseVoices.length} 个中文语音`);
                        ttsAvailable = true;
                        
                        // 启用TTS控制按钮
                        document.getElementById('start-tts-btn').disabled = false;
                        document.getElementById('test-tts-btn').disabled = false;
                    } else {
                        log(`找到 ${voices.length} 个语音，但无中文语音`);
                        ttsAvailable = true; // 仍然可以尝试使用默认语音
                    }
                }

                // 测试TTS功能
                function testTTS() {
                    if (!ttsAvailable) {
                        log('TTS功能不可用');
                        return;
                    }
                    
                    // 停止当前朗读
                    stopReading();
                    
                    const testText = '测试语音合成，这是朗读功能测试。当前时间：' + new Date().toLocaleTimeString();
                    
                    currentUtterance = new SpeechSynthesisUtterance(testText);
                    currentUtterance.lang = 'zh-CN';
                    currentUtterance.rate = 0.9;  // 语速
                    currentUtterance.pitch = 1.0; // 音调
                    currentUtterance.volume = 1.0; // 音量
                    
                    currentUtterance.onstart = function() {
                        isSpeaking = true;
                        isPaused = false;
                        log('开始测试朗读...');
                        updateTTSButtons();
                    };
                    
                    currentUtterance.onend = function() {
                        isSpeaking = false;
                        log('测试朗读结束');
                        updateTTSButtons();
                    };
                    
                    currentUtterance.onerror = function(event) {
                        isSpeaking = false;
                        log('朗读出错: ' + event.error);
                        updateTTSButtons();
                    };
                    
                    speechSynthesis.speak(currentUtterance);
                }

                // 开始朗读当前段落
                function startReading() {
                    if (!ttsAvailable || !currentParagraph) {
                        log('请先点击一个段落');
                        return;
                    }
                    
                    // 停止当前朗读
                    stopReading();
                    
                    const text = currentParagraph.innerText.trim();
                    if (!text) {
                        log('段落内容为空');
                        return;
                    }
                    
                    currentUtterance = new SpeechSynthesisUtterance(text);
                    currentUtterance.lang = 'zh-CN';
                    currentUtterance.rate = 0.9;
                    currentUtterance.pitch = 1.0;
                    currentUtterance.volume = 1.0;
                    
                    currentUtterance.onstart = function() {
                        isSpeaking = true;
                        isPaused = false;
                        log('开始朗读...');
                        updateTTSButtons();
                    };
                    
                    currentUtterance.onend = function() {
                        isSpeaking = false;
                        log('朗读结束');
                        updateTTSButtons();
                    };
                    
                    currentUtterance.onerror = function(event) {
                        isSpeaking = false;
                        log('朗读出错: ' + event.error);
                        updateTTSButtons();
                    };
                    
                    speechSynthesis.speak(currentUtterance);
                }
                
                // 切换暂停/继续
                function togglePause() {
                    if (!isSpeaking) return;
                    
                    if (isPaused) {
                        speechSynthesis.resume();
                        isPaused = false;
                        log('继续朗读');
                    } else {
                        speechSynthesis.pause();
                        isPaused = true;
                        log('暂停朗读');
                    }
                    
                    updateTTSButtons();
                }
                
                // 停止朗读
                function stopReading() {
                    if (speechSynthesis.speaking) {
                        speechSynthesis.cancel();
                        isSpeaking = false;
                        isPaused = false;
                        log('停止朗读');
                        updateTTSButtons();
                    }
                }
                
                // 更新TTS按钮状态
                function updateTTSButtons() {
                    const startBtn = document.getElementById('start-tts-btn');
                    const pauseBtn = document.getElementById('pause-tts-btn');
                    const stopBtn = document.getElementById('stop-tts-btn');
                    const testBtn = document.getElementById('test-tts-btn');
                    
                    // 如果没有段落被选中，禁用开始按钮
                    startBtn.disabled = !ttsAvailable || !currentParagraph;
                    
                    // 暂停按钮状态
                    pauseBtn.disabled = !isSpeaking;
                    pauseBtn.textContent = isPaused ? '继续' : '暂停';
                    
                    // 停止按钮状态
                    stopBtn.disabled = !isSpeaking;
                    
                    // 测试按钮状态
                    testBtn.disabled = !ttsAvailable;
                    
                    // 添加/移除激活状态
                    pauseBtn.classList.toggle('active', isSpeaking);
                    stopBtn.classList.toggle('active', isSpeaking);
                }

                // 清除高亮
                function clearHighlight() {
                    document.querySelectorAll('.reading-active').forEach(e => {
                        e.classList.remove('reading-active');
                    });
                }

                // 为段落添加点击事件
                function setupParagraphClickEvents() {
                    const paragraphs = document.querySelectorAll('#content-wrapper p, #content-wrapper h2');
                    paragraphs.forEach((p, index) => {
                        // 移除旧的事件监听器，避免重复绑定
                        p.removeEventListener('click', handleParagraphClick);
                        p.addEventListener('click', handleParagraphClick);
                    });
                }

                // 段落点击处理
                function handleParagraphClick(event) {
                    const paragraph = event.currentTarget;
                    const text = paragraph.innerText.trim();
                    
                    if (!text) return;
                    
                    // 停止当前朗读
                    stopReading();
                    
                    // 高亮当前段落
                    clearHighlight();
                    paragraph.classList.add('reading-active');
                    currentParagraph = paragraph;
                    
                    log('选中段落: ' + text.substring(0, 30) + '...');
                    
                    // 更新按钮状态
                    updateTTSButtons();
                }

                // 简化的页面加载
                async function loadNext(idx) {
                    if (loading || isEnd) return;
                    loading = true;
                    document.getElementById('loading-tip').style.display = 'block';
                    try {
                        const res = await fetch(`/api/chapter?bid=${bid}&idx=${idx}`);
                        const data = await res.json();
                        if (data.code !== 200) { isEnd = true; return; }
                        
                        let div = document.createElement('div');
                        div.className = 'chapter-section';
                        div.innerHTML = `<h2>${data.title}</h2>${data.content}`;
                        document.getElementById('content-wrapper').appendChild(div);
                        
                        currentIdx = idx;
                        document.getElementById('p-info').innerText = `章节: ${currentIdx + 1} / ${data.total}`;
                        if (currentIdx >= data.total - 1) isEnd = true;
                        
                        // 内容加载完成后设置点击事件
                        setTimeout(setupParagraphClickEvents, 100);
                    } finally {
                        loading = false;
                        document.getElementById('loading-tip').style.display = 'none';
                    }
                }

                // 瀑布流滚动监听
                window.onscroll = () => {
                    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 1200) {
                        loadNext(currentIdx + 1);
                    }
                };
                
                // 页面加载完成
                window.onload = function() {
                    log('页面加载完成');
                    
                    // 检查TTS可用性
                    checkTTSAvailability();
                    
                    // 加载初始章节
                    loadNext(currentIdx);
                    
                    // 初始按钮状态
                    updateTTSButtons();
                };
                
                // 页面卸载时停止朗读
                window.onbeforeunload = function() {
                    stopReading();
                };
            </script>
        </body>
        </html>
        r   Content-typeztext/html; charset=utf-8utf-8)r   send_headerr   wfilewriteencode)r!   htmls     r   r   zNovelHandler.serve_reader_ui+   sr    Rf 	3)CDDD
W--.....r   c                 R   	 |                     ddg          d         }t          |                     ddg          d                   }|j                             |g           }|r|dk     s|t          |          k    r|                     ddd           d S ||         }|                    ||d	                   }|                     d
|d         |t          |          d           d S # t          $ r0}|                     dt          |          d           Y d }~d S d }~ww xY w)Nbid r   idx0i  u   章节不存在)codemsgcidr   title)r1   r4   contenttotali  )getint
book_cachelen	send_jsonfetch_chapter_text	Exceptionstr)	r!   r   r   r-   r/   chapter_listcurrentr5   es	            r   r   zNovelHandler.serve_chapter_data  sD   	9))EB4((+Ceiiu--a011C!,00b99L 377cS5F5F.F.F4EFFGGG"3'G//WU^DDGNNC''2Bwadeqararssttttt 	9 	9 	9NNCA77888888888	9s   BC, AC, ,
D&6%D!!D&c                    |                      d           |                     dd           |                                  | j                            t          j        |d                              d                     d S )Nr   r%   zapplication/jsonF)ensure_asciir&   )r   r'   r   r(   r)   jsondumpsr*   )r!   datas     r   r;   zNovelHandler.send_json  sx    3);<<<
Du===DDWMMNNNNNr   c                     d S Nr   )r!   formatargss      r   log_messagezNovelHandler.log_message        r   N)r   r   r	   r#   r   r   r;   rK   r   r   r   r   r      s^        ! ! !(X/ X/ X/t9 9 9O O O /....r   r   c                   ^    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd ZdS )
BaseSpiderr.   c                     d S rH   r   r!   extends     r   initzBaseSpider.init  rL   r   c                     d S rH   r   r!   s    r   getNamezBaseSpider.getName  rL   r   c                     g S rH   r   rT   s    r   getDependencezBaseSpider.getDependence  s    BYr   c                     d S rH   r   )r!   urls     r   isVideoFormatzBaseSpider.isVideoFormat  rL   r   c                     d S rH   r   rT   s    r   manualVideoCheckzBaseSpider.manualVideoCheck  rL   r   c                     d S rH   r   )r!   filters     r   homeContentzBaseSpider.homeContent  rL   r   c                     d S rH   r   rT   s    r   homeVideoContentzBaseSpider.homeVideoContent  rL   r   c                     d S rH   r   )r!   tidpgr^   rQ   s        r   categoryContentzBaseSpider.categoryContent  rL   r   c                     d S rH   r   )r!   idss     r   detailContentzBaseSpider.detailContent  rL   r   c                     d S rH   r   )r!   keyquicks      r   searchContentzBaseSpider.searchContent  rL   r   c                     d S rH   r   r!   flagidvipFlagss       r   playerContentzBaseSpider.playerContent  rL   r   c                     d S rH   r   r!   paramss     r   
localProxyzBaseSpider.localProxy  rL   r   c                     d S rH   r   rT   s    r   destroyzBaseSpider.destroy  rL   r   Nr.   )r   r   r	   rR   rU   rW   rZ   r\   r_   ra   re   rh   rl   rr   rv   rx   r   r   r   rN   rN     s        ####&&&&&&$$$'''$$$<<<&&&---555&&&r   rN   c            	           e Zd ZdZdZi ZdZd Zd dZd Z	d Z
d Zd	Zd
ZdZddddeddddZd Zd Zd Zd!dZd Zd Zd Zd Zd Zd"dZd Zd Zd ZdS )#SpiderNr   c                     dS )Nu   阅读助手(羊皮纸+TTS)r   rT   s    r   rU   zSpider.getName  s    ;;r   r.   c                 >    |                                   d S #  Y d S xY wrH   )_start_serverrP   s     r   rR   zSpider.init  s'    !!!!!s    c                 X    | j         r"| j                                          d | _         d S d S rH   )r   shutdownrT   s    r   rx   zSpider.destroy  s5    ; 	K  """DKKK	 	r   c                 h    | j         r*| j                                          n#  Y nxY wd | _         d S d S rH   )current_dialogdismissrT   s    r   r   zSpider.close_dialog  sH     	'$,,....DD"&D	' 	's   " &c                    | j         rd S 	 t          j        t          j        t          j                  }|                    d           |                                d         | _        |                                 t          d| j        ft                    | _         | | j         _
        t          j        | j         j                  }d|_        |                                 d S #  Y d S xY w)N)	127.0.0.1r      r   targetT)r   socketAF_INETSOCK_STREAMbindgetsocknameserver_portcloser   r   r   	threadingThreadserve_foreverdaemonstart)r!   sockts      r   r~   zSpider._start_server  s    ;
	=1CDDDII&'''#//11!4DJJLLL,k4;K-Ll[[DK!%DK (ABBBAAHGGIIIIIs   CC% %C*s   242ccb8230d709e1d3dGiJc651gSQ8w1zcom.kmxs.reader51110androidr0   1unknown)zapp-versionplatformregAUTHORIZATIONzapplication-idznet-envchannelz	qm-paramsc                 
   t                                                    }d                    fd|D                       | j        z   }t	          j        |                    d                                                    S )Nr.   c                 *    g | ]}| d |          S )=r   ).0kru   s     r   
<listcomp>z#Spider.get_sign.<locals>.<listcomp>  s+    DDD1q..6!9..DDDr   r&   )sortedkeysjoinSIGN_KEYhashlibmd5r*   	hexdigest)r!   ru   sorted_keyssign_strs    `  r   get_signzSpider.get_sign  sm    V[[]]++77DDDDDDDEEU{8??73344>>@@@r   c                 r    | j                                         }|                     |          |d<   d|d<   |S )Nsignzokhttp/3.12.1z
User-Agent)BASE_HEADERScopyr   )r!   headerss     r   get_headerszSpider.get_headers  s:    #((**--00 /r   c                    	 t          j        |          }t          j        | j        t          j        |d d                   }|                    |dd                    }t          |t          j                  	                    d          S #  |	                    dd          
                                cY S xY w#  Y dS xY w)N   r&   ignoreu   解密失败)base64	b64decoder   newAES_KEYMODE_CBCdecryptr   
block_sizedecodestrip)r!   base64_contentencrypted_bytescipher	decrypteds        r   decrypt_contentzSpider.decrypt_content   s    	&$.~>>OWT\3<"9MNNFrss';<<Ii88??HHHF9++GX>>DDFFFFF%~~~s$   AB<  ,B *B97B< 9B< <Cbcc                 V    |                      |          |d<   |dk    rdnd}| | |fS )Nr   r   zhttps://api-bc.wtzw.comzhttps://api-ks.wtzw.com)r   )r!   r   ru   domain_typebase_urls        r   get_api_urlzSpider.get_api_url)  sC    v..v0;t0C0C,,Ib"D""F**r   c                    	 ||d}|                      d|d          \  }}t          j        |||                                 d          }|                                }d|v r]d|d         v rS|                     |d         d                   }d                    d	 |                    d
          D                       S d|                    dd           dS # t          $ r}	dt          |	           dcY d }	~	S d }	~	ww xY w)N)rp   	chapterIdz/api/v1/chapter/contentks   )ru   r   timeoutrF   r5   r.   c                 B    g | ]}|                                 d | dS )z<p></p>)r   )r   lines     r   r   z-Spider.fetch_chapter_text.<locals>.<listcomp>6  s6    ]]]TPTPZPZP\P\] 0d 0 0 0]]]r   
z<p style='color:red'>r2   u   无法读取r   )
r   requestsr7   r   rD   r   r   splitr=   r>   )
r!   r-   r3   ru   rY   signedrjrawrA   s
             r   r<   zSpider.fetch_chapter_text.  s   		Kc22F**+DfdSSKCS9I9I9K9KUVWWWAA{{yAfI55**1V9Y+?@@ww]]SYYt__]]]^^^M155+G+GMMMMJJJ&Jc!ff&J&J&JJJJJJJJs$   B=C  C 
D$C<6D<Dc                 (    g d}d |D             i dS )N))u   玄幻奇幻z1|202)u   都市人生z1|203)u   武侠仙侠z1|205)u   历史军事z1|56)u   科幻末世z1|64)u   游戏竞技z1|75)u   现代言情z2|1)u   古代言情z2|2)u   幻想言情z2|4)u   婚恋情感z2|6)u   悬疑推理z3|262c                     g | ]
\  }}||d S ))	type_nametype_idr   )r   nis      r   r   z&Spider.homeContent.<locals>.<listcomp><  s$    JJJTQa88JJJr   )classfiltersr   )r!   r^   catss      r   r_   zSpider.homeContent:  s3     n  n  nJJTJJJWYZZZr   c                 
    dg iS )Nlistr   rT   s    r   ra   zSpider.homeVideoContent>  s    | 3r   c           	         |                     d          \  }}n#  d\  }}Y nxY w||d|dd}|                     d|d          \  }}		 t          j        ||	|                                                                           }
g }|
                    di                               d	g           p|
                    d	g           D ]u}|                    t          |                    d
                    |                    d          |                    d          |                    d          d           v||ddddS #  dg icY S xY w)N|)r   202r   )gendercategory_idneed_filterspageneed_categoryz/api/v4/category/get-listr   ru   r   rF   booksrp   r4   
image_linkauthorvod_idvod_namevod_picvod_remarksi     i'  )r   r   	pagecountlimitr6   r   )r   r   r   r7   r   rD   appendr>   )r!   rc   rd   r^   rQ   r   cat_idru   rY   r   r   videosbs                r   re   zSpider.categoryContent@  s   !iinn^VVV+"63XZmpqq&&'BFDQQV	$S9I9I9K9KLLLQQSSAFeeFB''++GR88NAEE'2<N<N X XQUU4[[)9)9quuW~~bcbgbghtbubu  GH  GL  GL  MU  GV  GV  W  W  X  X  X  X"BS2X\]]]#|###s    #	C:E Ec           	         |d         }|ddd}|                      d|d          \  }}|ddd	}	 t          j        |||                                 
                                          }d|v rd|d         v r|d         d         }|                    |                    d          |                    d          |                    d          |                    dd           d|                    d          d           d|i}	|                      d|	d          \  }
}t          j        |
||                                 
                                          }g }g }t          |                    di                               dg                     D ]m\  }}|                    t          |d                   |d         d           |                    |d         	                    dd           d| d|            n|| j
        |<   d                    |          |d<   d|giS # t          $ r}d|gicY d }~S d }~ww xY w)Nr   
2937357107r0   )rp   imei_ip
teeny_modez/api/v4/book/detailr   u	   加载中u   阅读助手)r   r   vod_play_fromr   rF   bookr4   r   category_name	words_numr.   u   字intro)r   r   r   r   vod_contentrp   z/api/v1/chapter/chapter-listr   chapter_lists)r3   r4   $@@#vod_play_urlr   )r   r   r7   r   rD   update	enumerater   r>   replacer9   r   r=   )r!   rg   r-   ru   rY   r   vodr   infoc_paramsc_urlc_signedc_jchaptersdisplayr/   itemrA   s                     r   rh   zSpider.detailContentM  s   !fCHH&&'<fdKKV+WW	6S9I9I9K9KLLLQQSSA{{v622y(

(9(9dhh|F\F\koksks  uD  lE  lE  Y]  Ya  Ya  bm  oq  Yr  Yr  Vw  Vw  Vw  HL  HP  HP  QX  HY  HY  Z  Z  [  [  [c{H"../MxY]^^OE8,uXt?O?O?Q?QRRRWWYYCHR7&swwvr':':'>'>PR'S'STT P P	TDJ$w- P PQQQ$w-"7"7B"?"?NN#NNNNOOOO#+DOC "%((7"3"3CSE?"555vuo5555555s   G=H. .
I8I<IIc           	      "   dd||d}|                      d|d          \  }}	 t          j        |||                                                                           }g }|                    di                               dg           D ]u}	|                    t          |	                    d	                    |	                    d
          |	                    d          |	                    d          d           v||dS #  g |dcY S xY w)N3r   )r   r   r   wdz/api/v5/search/wordsr   r   rF   r   rp   original_titler   original_authorr   )r   r   )r   r   r7   r   rD   r   r>   )
r!   rj   rk   rd   ru   rY   r   r   r   r   s
             r   rl   zSpider.searchContentc  sH   L"CPP&&'=vtLLV	0S9I9I9K9KLLLQQSSAFUU62&&**7B77 j jQUU4[[)9)9quuM]G^G^klkpkpq}k~k~  PQ  PU  PU  Vg  Ph  Ph  i  i  j  j  j  j"B////B/////s   C!D Dc                     t          j        | j        |                    d          d         |                    d          d         f                                           dddddS )Nr
  r   r   )r   rJ   r.   zhttp://127.0.0.1/dummy)r   playUrlrY   header)r   r   _show_popup_dialogr   r   rn   s       r   rr   zSpider.playerContentn  se     7rxx~~a?PRTRZRZ[_R`R`abRc>deeekkmmmr2JVXYYYr   c                 h      fd}t          j        |                                           d S )Nc                  2   	 ddl mm}  ddlm}  d          }|                    d          }|                    d                              d           }|                    d          }|	                    d           |
                    |                                          }	 |                                }nA#  |                                                    d	                              |          }Y nxY wd |D ]}	 |                                }	|	                    d
          }
|
	                    d           |

                    |          }|r,|                                s|                                s| n#  Y xY wsd S  G d d | |                    }fd}                     ||                     d S # t"          $ r5}t%          d|            dd l}|                                 Y d }~d S d }~ww xY w)Nr   )jclassdynamic_proxy)Runnablezjava.lang.Classzandroid.app.ActivityThreadcurrentActivityThreadmActivitiesTtoArrayactivityc                   $     e Zd Z fdZd Z xZS );Spider._show_popup_dialog.<locals>.launch.<locals>.UiRunnerc                 V    t                                                       || _        d S rH   )super__init__func)r!   r0  	__class__s     r   r/  zDSpider._show_popup_dialog.<locals>.launch.<locals>.UiRunner.__init__  s$    ((***$(			r   c                 @    	 |                                   d S #  Y d S xY wrH   )r0  rT   s    r   runz?Spider._show_popup_dialog.<locals>.launch.<locals>.UiRunner.run  s(    ! IIKKKKK! DDs    )r   r   r	   r/  r3  __classcell__)r1  s   @r   UiRunnerr,    sG        ) ) ) ) )! ! ! ! ! ! !r   r5  c                  ,   	  d          }  d          } d          } d          } |           }|_         |                    d           |                                }|rq|                                                    dddd           |                     ||                    d                               |                    dd            |          }|                                }|	                    d	           |
                    d	           |                    d
           |                    |                    d                     dj         d d }t          d|            |                    |           |                    |           |                                 t          d           d S # t$          $ r5}	t          d|	            dd l}
|
                                 Y d }	~	d S d }	~	ww xY w)Nzandroid.app.Dialogzandroid.webkit.WebViewz'android.graphics.drawable.ColorDrawablezandroid.graphics.Colorr   r   z#f8f1e3TFzhttp://127.0.0.1:z/read.html?bid=z&idx=u   加载阅读器页面: u   弹窗显示成功u   弹窗显示异常: )r   requestWindowFeature	getWindowgetDecorView
setPaddingsetBackgroundDrawable
parseColor	setLayoutgetSettingssetJavaScriptEnabledsetDomStorageEnabled#setMediaPlaybackRequiresUserGesturesetBackgroundColorr   printloadUrlsetContentViewshowr=   	traceback	print_exc)DialogWebViewColorDrawableColordwinwwsrY   rA   rH  actr-   indexr$  r!   s              r   rG  z7Spider._show_popup_dialog.<locals>.launch.<locals>.show  sL   $.!'(<!=!="(&)A"B"B(./X(Y(Y &'? @ @"F3KK./+..q111kkmm 2,,..99!AaBBB55mmEDTDTU^D_D_6`6`aaaMM"b111#GCLL]]__//555//555>>uEEE,,U-=-=i-H-HIII e$2BddSVdd]bdd===>>>		#((+++233333$ . . .8Q88999((((!++---------.s   GG 
H*HHu   弹窗启动失败: )javar$  r%  	java.langr&  forName	getMethodinvokegetDeclaredFieldsetAccessibler7   valuesr)  getClassisFinishingisDestroyedrunOnUiThreadr=   rD  rH  rI  )r%  r&  JClassAT	currentATr(  r[  recordsr   rClassactivityFieldtemp_actr5  rG  rA   rH  rR  r$  r-   rS  r!   s                   @@r   launchz)Spider._show_popup_dialog.<locals>.launcht  s   S&66666666...... 122^^$@AALL)@AAHHNN	 11-@@))$///$33::<<T$nn..GGT$oo//99)DDKKFSSGGG  
! 
!A	!!"(.(?(?
(K(K%33D999#0#4#4Q#7#7# "H,@,@,B,B "8K_K_KaKa ""*C!E!  F	! 	! 	! 	! 	!}}X66 	! 	! 	!%. %. %. %. %. %. %. %. %.N !!((4..11111 & & &0Q00111    ##%%%%%%%%%&sO   B'G -C G <D >G 
A?F	G FG >G 
H!*HHr   )r   r   r   )r!   r-   rS  rg  s   ``` r   r!  zSpider._show_popup_dialogs  sX    T	& T	& T	& T	& T	& T	& T	&l 	'''--/////r   c                     d S rH   r   rt   s     r   rv   zSpider.localProxy  rL   r   ry   )r   )r   )r   r   r	   r   r   r9   r   rU   rR   rx   r   r~   r   r   APP_IDr   r   r   r   r   r<   r_   ra   re   rh   rl   rr   r!  rv   r   r   r   r{   r{     s       FKJN;;;     
' ' '   "G!HF#*y]_rx  FI  U^  ln  o  oLA A A
  & & &+ + + +

K 
K 
K[ [ [ 433$ $ $6 6 6,	0 	0 	0 	0Z Z Z
W0 W0 W0r '&&&&r   r{   )sysr   r   rD   r   r   r   http.serverhttpsocketserverurllib.parser   Crypto.Cipherr   Crypto.Util.Paddingr   ThreadingMixInr   
HTTPServerr   BaseHTTPRequestHandlerr   rN   r{   r   r   r   <module>rt     sc   


                            % % % % % %    4dk6L   C/ C/ C/ C/ C/4;5 C/ C/ C/N       `' `' `' `' `'Z `' `' `' `' `'r   