U
    Tg8                     @   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://8.215.44.123/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   '/var/www/html/dlvid/final_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.comZ	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  zt 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 ))-_rH   N)isalnum).0cr   r   r   	<genexpr>u   s     z>VideoDownloader.create_public_download_link.<locals>.<genexpr>rH   /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rR   r"   )r   r   r   r*   r+   basenamer5   uuiduuid4r6   shutilcopy2r   openwriter,   check_outputdecoder-   r   r)   r;   r9   r"   )r   rS   titleexpiry_hoursr>   r?   Z	unique_idZ
safe_titleZpublic_filenameZpublic_file_pathZdownload_urlZinfo_file_pathfZ
delete_cmdZat_timerC   r   r   r   create_public_download_linkl   s@    
$z+VideoDownloader.create_public_download_linkFc           
   
   C   s6  zt |}|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 foundrT   )Zoutput_pathz.mp3mp3rR   rS   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;   r5   r)   download_with_ytdlp)
r   r   
audio_onlyZytstreamout_filebaserH   Zmp3_filerC   r   r   r   download_youtube   s,    
z VideoDownloader.download_youtubec              
      sZ  zddl }| |}| dtd   tj| j }|d dddddddd	d
	}|r~|dddddgd d}n|ddi d}|	|d}| j
d| d |j|dd}	|	s| j
d|  dddW  5 Q R  W S d|	kr8|	d s,| j
d|  dddW  5 Q R  W S |	d d }	|sJ|	dd}|	dd}
| d | }tj|s fd!d"t| jD }|rt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
rT } z,| j
d't|  dt|d W Y S d}~X Y nX dS )(zJDownload video using yt-dlp for all platforms with improved error handlingr   NrH      z.%(ext)sFTr      )	ZouttmplquietZno_warningsverboseZignoreerrorsZnocheckcertificateZ
geo_bypassretriesZsocket_timeoutzbestaudio/bestZFFmpegExtractAudiorb   Z192)keyZpreferredcodecZpreferredquality)r	   Zpostprocessorsr	   Zbestrd   zAttempting to download z with yt-dlp)rh   zNo information extracted for z#Failed to extract video informationrT   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)rJ   r`   filenamer   r   
<listcomp>   s     
 z7VideoDownloader.download_with_ytdlp.<locals>.<listcomp>zFound alternative file: zDownloaded file not found at zDownloaded file not foundrc   zError downloading with yt-dlp: )yt_dlpr   r   urandomhexr*   r6   r   updateZ	YoutubeDLr   r)   Zextract_infor"   getr7   listdirr;   r5   )r   r   rk   r~   platformZoutput_templateZydl_optsZ	final_extZydlr)   r^   rS   Zpossible_filesrC   r   r{   r   rj      sv    
 

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: rR   r   z!yt-dlp failed, trying pytube for rS   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   rj   ro   r   r*   r8   rD   )r   r   rk   compressr=   r   rA   rS   Zfile_size_mbZcompressed_pathZnew_size_mbr   r   r   rh     s,    



zVideoDownloader.download)r   r   r   )r   N)rE   )F)F)FTr   )
r   
__module____qualname__r   r   rD   ra   ro   rj   rh   r   r   r   r   r   	   s   

F
3
 
Pr   )	r   r   r,   tempfilerV   rX   Zpytuber   r   r   r   r   r   <module>   s   