U
    eg@                     @   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   5/var/www/html/dlvid/all_platforms_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  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 ))-_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  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 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  zjd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kr|dddddddddgddgdidd |r|dddddgd d}n|dkr|d d!i d"}|	|f}| j
d#| d$ |j|dd%}	|	sR| 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|sH fd0d1t| jD }|rtj| j|d }| j
d2|  n*| j
d3|  dd4d(W  5 Q R  W S d||
|d5W  5 Q R  W S Q R X W nL tk
r } z,| j
d6t|  dt|d( W Y S d}~X Y nX dS )7zJDownload 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Accept)http_headersZextract_flatZforce_generic_extractorr   zbest[ext=mp4]/bestZandroidZwebZhlsZdash)Zplayer_clientskip   )rw   r	   Z
noplaylistZextractor_argsZextractor_retriesz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   updateZ	YoutubeDLr   r*   Zextract_infor#   getr8   listdirr<   r6   )r   r   rl   r   platformZoutput_templateZydl_optsZ	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   1  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
 
rr   )	r   r   r-   tempfilerW   rY   Zpytuber   r   r   r   r   r   <module>   s   