
    5i                        d Z ddlm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
 ddlmZ ddlmZ ddlZddlmZ  ej$                  e      Zd	Zg d
Zdddddddd
Z G d de      Zy)uw  
Pollinations Video Provider – generates videos from images/prompts via Pollinations.ai API.

Supports multiple models: veo, seedance, seedance-pro, wan, klein, ltx-2, etc.

Env vars:
  POLLINATIONS_API_KEY - API key from enter.pollinations.ai (optional for limited use)
  POLLINATIONS_VIDEO_MODEL - Model to use (default: seedance)

Docs: https://gen.pollinations.ai/docs
    )annotationsN)Callable)Path)Any)quote)VideoProviderzhttps://gen.pollinations.ai)veoseedancezseedance-prowankleinzklein-largezltx-2)         
   c                      e Zd ZdZdZd
ddZddZddZ	 d
	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	e
dd	       Zy)PollinationsVideoProviderzDWraps the Pollinations.ai API for video generation (image-to-video).pollinationsNc                   |xs t        j                  dd      | _        t        | _        t        j                  dd      | _        | j
                  t        vr-t        j                  d| j
                  t               d| _        yy)zInitialize the Pollinations video provider.
        
        Args:
            api_key: Optional API key. If not provided, uses POLLINATIONS_API_KEY env var.
                    Can work without key for limited usage.
        POLLINATIONS_API_KEY POLLINATIONS_VIDEO_MODELr
   z9Unknown video model '%s', using 'seedance'. Available: %sN)	osgetenvapi_keyPOLLINATIONS_BASE_URLbase_urlmodelVIDEO_MODELSloggerwarning)selfr   s     N/root/.openclaw/workspace/visionaryfx/providers/pollinations_video_provider.py__init__z"PollinationsVideoProvider.__init__;   si     G")),BB"G-YY9:F
::\)NNK


 $DJ *    c                F   t         j                  d|       t        |d      5 }d|j                  |dfi}t	        j
                  d|d      }|j                          ddd       j                  j                         }t         j                  d	|       |S # 1 sw Y   ;xY w)
a
  Upload image to temporary hosting service and return URL.
        
        Uses 0x0.st for temporary file hosting.
        
        Args:
            image_path: Path to local image file
            
        Returns:
            Public URL of uploaded image
        z#Uploading image to temp hosting: %srbfile	image/pngzhttps://0x0.st<   )filestimeoutNzImage uploaded to: %s)	r    debugopennamehttpxpostraise_for_statustextstrip)r"   
image_pathfr+   responseurls         r#   _upload_image_to_temp_urlz3PollinationsVideoProvider._upload_image_to_temp_urlN   s     	:JG*d# 	(qjooq+>?Ezz H
 %%'	( mm!!#,c2
	( 	(s   :BB c                $   t        |d      5 }|j                         }ddd       |j                  j                         }dddddd}|j	                  |d      }t        j                        j                  d      }d	| d
| S # 1 sw Y   ixY w)zConvert local image to base64 data URL.
        
        Args:
            image_path: Path to local image file
            
        Returns:
            Base64 data URL string
        r'   Nr)   z
image/jpegz	image/gifz
image/webp)z.pngz.jpgz.jpegz.gifz.webpzutf-8zdata:z;base64,)r.   readsuffixlowergetbase64	b64encodedecode)r"   r5   r6   
image_dataext
mime_types	mime_typeb64_datas           r#   _image_to_data_urlz,PollinationsVideoProvider._image_to_data_urlh   s     *d# 	"qJ	" %%' !!

 NN34	##J/66w?yk(44	" 	"s   BBc                ,  K   t        j                  | j                  ||||j                  d      |j                  dd      |j                  dd      |j                  dd      |j                  dd	      |j                  d
d      
       d{   S 7 w)zAsync wrapper for image-to-video generation.
        
        Extra kwargs (model, duration, aspect_ratio, audio, seed, use_data_url) are passed to _generate_sync.
        r   duration   aspect_ratio16:9audioFseeduse_data_urlN)asyncio	to_thread_generate_syncr>   )r"   r5   video_promptoutput_pathon_progresskwargss         r#   generatez"PollinationsVideoProvider.generate   s      &&JJwJJz1%JJ~v.JJw&JJvr"JJ~u-
 
 	
 
s   BBBBc
                   t        |      }t        |      }|j                  j                  dd       |xs | j                  }|t        vrt
        j                  d|       d}t        j                  |d      \  }
}||
k  s||kD  r/t
        j                  d|||
|       t        |
t        ||            }|	r| j                  |      }n| j                  |      }t        |d      }| j                   d	| }|||||d
}|dk(  r|rd|d<   ddi}| j                  rd| j                   |d<   t
        j!                  d|||       t
        j#                  d|dd        t%        j&                  d      5 }|j                  |||      }|j)                          |j+                  |j,                         ddd       t
        j!                  d|t/        j,                               |S # 1 sw Y   5xY w)z Sync implementation of generate.T)parentsexist_okz$Unknown model '%s', using 'seedance'r
   r   z1Duration %d out of range for %s (%d-%d), clampingr   )safez/image/)r   imagerI   aspectRatiorN   r	   truerM   Acceptzvideo/*zBearer Authorizationu?   Generating video via Pollinations: model=%s duration=%ds → %sz
Prompt: %sNd   iX  )r,   )paramsheaderszVideo saved: %s (%d bytes))r   parentmkdirr   r   r    r!   DURATION_LIMITSr>   maxminrG   r9   r   r   r   infor-   r0   Clientr2   write_bytescontentlen)r"   r5   rT   rU   r   rI   rK   rM   rN   rP   min_durmax_dur	image_urlencoded_promptr8   rc   rd   clientr7   s                      r#   rS   z(PollinationsVideoProvider._generate_sync   s    *%
;'   =# $NNA5IE +..ug>gG!3NNC%' 7C$:;H //
;I66zBI |"5 w~&67  '
 E>e$F7O Y'<<)0'?GO$M		
 	\<#56 \\#& 	6&zz#fgzFH%%' ##H$4$45	6 	0+s8CSCS?TU	6 	6s   6A G**G3c                 *    t         j                         S )z&Return list of available video models.)r   copy r%   r#   list_modelsz%PollinationsVideoProvider.list_models   s       ""r%   )N)r   
str | None)r5   r   returnstr)r5   r   rT   rz   rU   r   rV   zCallable[[int], None] | NonerW   r   ry   r   )NrJ   rL   FrO   F)r5   
str | PathrT   rz   rU   r{   r   rx   rI   intrK   rz   rM   boolrN   r|   rP   r}   ry   r   )ry   z	list[str])__name__
__module____qualname____doc__r/   r$   r9   rG   rX   rS   staticmethodrw   rv   r%   r#   r   r   7   s    ND$&45B 59

 
 	

 2
 
 

< !""OO O  	O
 O O O O O O 
Ob # #r%   r   )r   
__future__r   rQ   r?   loggingr   collections.abcr   pathlibr   typingr   urllib.parser   r0   providers.portsr   	getLoggerr~   r    r   r   rg   r   rv   r%   r#   <module>r      sx   
 #    	 $     )			8	$5  z# z#r%   