U
    ë£úgù<  ã                   @   sN   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 G dd„ dƒZdS )é    N)ÚYouTubec                   @   sP   e Zd Zddd„Zdd„ Zdd
d„Zddd„Zddd„Zddd„Zddd„Z	d	S )ÚVideoDownloaderÚ	downloadsú/var/www/html/downloadsúhttp://your-server-ip/downloadsc                 C   s@   || _ || _|| _tj|dd tjdtjd t t	¡| _
d S )NT©Úexist_okz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)ÚformatÚlevel)Údownload_pathÚpublic_pathÚ
public_urlÚosÚmakedirsÚloggingÚbasicConfigÚINFOÚ	getLoggerÚ__name__Úlogger)Úselfr   r   r   © r   ú1/var/www/html/dlvid/instagram_fixed_downloader.pyÚ__init__
   s    þzVideoDownloader.__init__c                 C   sP   d|ksd|krdS d|ks,d|ks,d|kr0dS d|kr<d	S d
|krHdS dS dS )z#Determine the platform from the URLzyoutube.comzyoutu.beÚyoutubezfacebook.comzfb.comzfb.watchZfacebookzinstagram.comÚ	instagramz
tiktok.comZtiktokZgenericNr   )r   Úurlr   r   r   Úget_platform   s    zVideoDownloader.get_platformé
   Nc                 C   sf  z| j  d|› d|› d¡ |dkrDtj |¡\}}|› d|› }ztjddgtjtjdd	 W n, tjt	fk
rŽ   | j  
d
¡ | Y W S X ddddddd|g}tj|tjtjdd}|jdkrÞ| j  
d|j› ¡ |W S t|j ¡ ƒ}|d d d }	t|	|d  ƒ}
dd|dt|
ƒdt|
ƒdt|
d ƒdddd d!|g}| j  d"d# |¡› ¡ tj|tjtjd$}|jdkr| j  
d%|j› ¡ |W S tj |¡r
tj |¡d& }tj |¡d& }| j  d'|d(›d)|d(›d¡ ||k rì|W S | j  d*¡ t |¡ |W S n| j  
d+¡ |W S W nB tk
r` } z"| j  
d,t|ƒ› ¡ | W Y ¢S d}~X Y nX dS )-z#Compress video to target size in MBzCompressing video: z to target size: ÚMBNZ_compressedZffmpegz-versionT)ÚstdoutÚstderrÚcheckz(ffmpeg not found. Please install ffmpeg.Zffprobez-vÚerrorz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1)r    r!   Útextr   zError getting video duration: é   i   g333333ó?z-iz-b:vz-maxratez-bufsizeé   z-c:aZaacz-b:aZ128kz-yzRunning ffmpeg command: ú )r    r!   zError compressing video: é   zOriginal size: ú.2fzMB, Compressed size: zBCompressed file is not smaller than original. Using original file.zCompressed file was not createdzError in compress_video: )r   Úinfor   ÚpathÚsplitextÚ
subprocessÚrunÚPIPEÚSubprocessErrorÚFileNotFoundErrorr#   Ú
returncoder!   Úfloatr    ÚstripÚintÚstrÚjoinÚexistsÚgetsizeÚwarningÚremoveÚ	Exception)r   Ú
input_fileÚtarget_size_mbZoutput_fileÚ	file_nameÚfile_extÚcmdÚresultÚdurationZtarget_size_bitsZbitrateZoriginal_sizeZcompressed_sizeÚer   r   r   Úcompress_video&   sr    
  ÿ
     
    ú	


zVideoDownloader.compress_videoé   c              
   C   sú  z¦t j| jdd t j t j |¡¡\}}tt ¡ ƒdd… }d 	dd„ |D ƒ¡}|› d|› |› }t j 	| j|¡}	t
 ||	¡ | j› d	|› }
|	› d
}t|dƒb}| d|› d¡ | dt j |¡› d¡ | dt dg¡ d¡› ¡ | d|› d¡ W 5 Q R X zTd|	› d|› }d|› d}tjd|› d|› dd | j d|	› d|› d¡ W n6 tk
r˜ } z| j d|› ¡ W 5 d}~X Y nX d|
|	|dœW S  tk
rô } z,| j dt|ƒ› ¡ d t|ƒd!œ W Y ¢S d}~X Y nX dS )"z(Create a public download link for a fileTr   Nr%   Ú c                 s   s&   | ]}|  ¡ s|d kr|ndV  qdS ))ú-Ú_rI   N)Úisalnum)Ú.0Úcr   r   r   Ú	<genexpr>u   s     z>VideoDownloader.create_public_download_link.<locals>.<genexpr>rI   ú/z.infoÚwzTitle: Ú
zOriginal file: z	Created: Údatezutf-8zExpires: After z hours
zrm -f r'   znow + z hourszecho "z" | at )ÚshellzScheduled deletion of z after z"Could not schedule file deletion: )Úsuccessr   Ú	file_pathZexpires_in_hourszError creating download link: F©rS   r#   )r   r   r   r+   r,   Úbasenamer6   ÚuuidÚuuid4r7   ÚshutilÚcopy2r   ÚopenÚwriter-   Úcheck_outputÚdecoder.   r   r*   r<   r:   r#   )r   rT   ÚtitleÚexpiry_hoursr?   r@   Z	unique_idZ
safe_titleZpublic_filenameZpublic_file_pathZdownload_urlZinfo_file_pathÚfZ
delete_cmdZat_timerD   r   r   r   Úcreate_public_download_linkl   s@    
$üþz+VideoDownloader.create_public_download_linkFc           
   
   C   s6  zÔt |ƒ}|r†|jjdd ¡ }|sB| j d|› ¡ dddœW S |j| jd}tj	 
|¡\}}|d }t ||¡ d||jd	d
œW S |j ¡ }|s²| j d|› ¡ dddœW S |j| jd}d||jdd
œW S W n\ tk
r0 }	 z<| j dt|	ƒ› ¡ | j d|› ¡ |  ||¡ W Y ¢S d}	~	X Y nX dS )zEDownload video from YouTube using pytube with improved error handlingT)Z
only_audiozNo audio stream found for FzNo audio stream foundrU   )Zoutput_pathz.mp3Úmp3©rS   rT   r_   r	   zNo video stream found for zNo video stream foundÚmp4z,Error downloading from YouTube with pytube: zFalling back to yt-dlp for N)r   ÚstreamsÚfilterÚfirstr   r#   Údownloadr   r   r+   r,   Úrenamer_   Zget_highest_resolutionr<   r6   r*   Údownload_with_ytdlp)
r   r   Ú
audio_onlyZytÚstreamÚout_fileÚbaserI   Zmp3_filerD   r   r   r   Údownload_youtubeŸ   s,    
z VideoDownloader.download_youtubec              
      s¬  zXddl }|  |¡}|› dt d¡ ¡ › ‰ tj | jˆ ¡}|d dddddddd	d
œ	}|dkrª| ddddœddddœ¡ tj 	d¡sªt
ddƒ}| d¡ W 5 Q R X |rÎ| dddddœgdœ¡ d}n| ddi¡ d}| |¡f}	| j d|› d¡ |	j|dd}
|
s@| j d |› ¡ dd!d"œW  5 Q R £ W S d#|
krŠ|
d# s~| j d$|› ¡ dd%d"œW  5 Q R £ W S |
d# d }
|sœ|
 d&d¡}|
 d'd(¡}|› d)|› }tj 	|¡s6‡ fd*d+„t | j¡D ƒ}|rtj | j|d ¡}| j d,|› ¡ n*| j d-|› ¡ dd.d"œW  5 Q R £ W S d|||d/œW  5 Q R £ W S Q R X W nL tk
r¦ } z,| j d0t|ƒ› ¡ dt|ƒd"œ W Y ¢S d}~X Y nX dS )1zJDownload video using yt-dlp for all platforms with improved error handlingr   NrI   é   z.%(ext)sFTr   é   )	ZouttmplÚquietZno_warningsÚverboseZignoreerrorsZnocheckcertificateZ
geo_bypassÚretriesZsocket_timeoutr   zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36zen-US,en;q=0.9zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8)z
User-AgentzAccept-LanguageÚAcceptzcookies.txt)Zhttp_headersZ
cookiefileZextract_flatZforce_generic_extractorrO   rG   zbestaudio/bestZFFmpegExtractAudiorc   Z192)ÚkeyZpreferredcodecZpreferredquality)r	   Zpostprocessorsr	   Zbestre   zAttempting to download z with yt-dlp)ri   zNo information extracted for z#Failed to extract video informationrU   Úentriesz(Empty playlist or all videos failed for z#Empty playlist or all videos failedÚextr_   ÚVideoÚ.c                    s   g | ]}|  ˆ ¡r|‘qS r   )Ú
startswith)rK   ra   ©Úfilenamer   r   Ú
<listcomp>  s     
 z7VideoDownloader.download_with_ytdlp.<locals>.<listcomp>zFound alternative file: zDownloaded file not found at zDownloaded file not foundrd   zError downloading with yt-dlp: )Úyt_dlpr   r   ÚurandomÚhexr+   r7   r   Úupdater8   r[   r\   Z	YoutubeDLr   r*   Zextract_infor#   ÚgetÚlistdirr<   r6   )r   r   rl   r€   ÚplatformZoutput_templateZydl_optsra   Z	final_extZydlr*   r_   rT   Zpossible_filesrD   r   r}   r   rk   ¿   s    
÷ýøýþ ÿ

üz#VideoDownloader.download_with_ytdlpTc                 C   sL  | j  d|› d|› d|› ¡ |  |¡}| j  d|› ¡ |  ||¡}|d sx|dkrx|sx| j  d|› ¡ |  ||¡}|d rH|sH|rH|d }tj |¡d	 }||kr$| j  d
|d›d|› d¡ |  ||¡}	|	|kr|	|d< d|d< tj |	¡d	 }
| j  d|
d›d¡ nd|d< n$| j  d
|d›d|› d¡ d|d< |S )z,Main download method with compression optionzStarting download for z, audio_only=z, compress=zDetected platform: rS   r   z!yt-dlp failed, trying pytube for rT   r(   zFile size (r)   zMB) exceeds target size (zMB). Compressing...TÚ
compressedz Compression complete. New size: r   Fz"MB) is already below target size (zMB). Skipping compression.)	r   r*   r   rk   rp   r   r+   r9   rE   )r   r   rl   Úcompressr>   r†   rB   rT   Zfile_size_mbZcompressed_pathZnew_size_mbr   r   r   ri   "  s,    



zVideoDownloader.download)r   r   r   )r   N)rF   )F)F)FTr   )
r   Ú
__module__Ú__qualname__r   r   rE   rb   rp   rk   ri   r   r   r   r   r   	   s   

F
3
 
cr   )	r   r   r-   ÚtempfilerW   rY   Zpytuber   r   r   r   r   r   Ú<module>   s   