§
    šŠtj)  ã                   ó$  — d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ  G d	„ d
e¦  «        Zedk    rC eddd¬¦  «        Ze                     ¦   «         Z ed ee¦  «        › dej        › �¦  «         dS dS )é    N)ÚPath)ÚAnyÚListÚOptionalÚTuple)Úunquote)ÚDocument)ÚDirectoryLoader)ÚPyPDFLoader)ÚWebBaseLoaderc                   ó\  ‡ — e Zd ZdZ	 	 	 	 	 ddedededeeeef                  d	ee         d
edefˆ fd„Z	dd„Z
dee         fd„Zdedefd„Zdedee         fd„Zdedee         fd„Zdee         ddfd„Zdee         fd„Zdedee         fd„Zdeddfd„Zdedefd„Zdedefd„Zˆ xZS )ÚBlackboardLoadera'  Load a `Blackboard` course.

    This loader is not compatible with all Blackboard courses. It is only
    compatible with courses that use the new Blackboard interface.
    To use this loader, you must have the BbRouter cookie. You can get this
    cookie by logging into the course and then copying the value of the
    BbRouter cookie from the browser's developer tools.

    Example:
        .. code-block:: python

            from langchain_community.document_loaders import BlackboardLoader

            loader = BlackboardLoader(
                blackboard_course_url="https://blackboard.example.com/webapps/blackboard/execute/announcement?method=search&context=course_entry&course_id=_123456_1",
                bbrouter="expires:12345...",
            )
            documents = loader.load()

    TNFÚblackboard_course_urlÚbbrouterÚload_all_recursivelyÚ
basic_authÚcookiesÚcontinue_on_failureÚshow_progressc                 ó”  •— t          ¦   «                              |||¬¦  «         	 |                     d¦  «        d         | _        n# t          $ r t	          d¦  «        ‚w xY w|�|| j        _        |€i }|                     d|i¦  «         | j        j                             |¦  «         || _	        |  
                    ¦   «          dS )aY  Initialize with blackboard course url.

        The BbRouter cookie is required for most blackboard courses.

        Args:
            blackboard_course_url: Blackboard course url.
            bbrouter: BbRouter cookie.
            load_all_recursively: If True, load all documents recursively.
            basic_auth: Basic auth credentials.
            cookies: Cookies.
            continue_on_failure: whether to continue loading the sitemap if an error
                occurs loading a url, emitting a warning instead of raising an
                exception. Setting this to True makes the loader more robust, but also
                may result in missing data. Default: False
            show_progress: whether to show a progress bar while loading. Default: True

        Raises:
            ValueError: If blackboard course url is invalid.
        )Ú	web_pathsr   r   z/webapps/blackboardr   zpInvalid blackboard course url. Please provide a url that starts with https://<blackboard_url>/webapps/blackboardNÚBbRouter)ÚsuperÚ__init__ÚsplitÚbase_urlÚ
IndexErrorÚsessionÚauthÚupdater   r   Ú	check_bs4)	Úselfr   r   r   r   r   r   r   Ú	__class__s	           €úm/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/document_loaders/blackboard.pyr   zBlackboardLoader.__init__$   sí   ø€ õ: 	‰Œ×ÒØ,Ø 3Ø'ð 	ñ 	
ô 	
ð 	
ð	Ø1×7Ò7Ð8MÑNÔNÈqÔQˆDŒMˆMøÝð 	ð 	ð 	Ýð>ñô ð ð	øøøð Ð!Ø *ˆDŒLÔàˆ?ØˆGØ�Š˜
 HÐ-Ñ.Ô.Ð.ØŒÔ×#Ò# GÑ,Ô,Ð,Ø$8ˆÔ!Ø�ŠÑÔÐÐÐs   § A ÁA"Úreturnc                 óJ   — 	 ddl }dS # t          $ r t          d¦  «        ‚w xY w)z|Check if BeautifulSoup4 is installed.

        Raises:
            ImportError: If BeautifulSoup4 is not installed.
        r   NzeBeautifulSoup4 is required for BlackboardLoader. Please install it with `pip install beautifulsoup4`.)Úbs4ÚImportError)r"   r'   s     r$   r!   zBlackboardLoader.check_bs4Y   sG   € ð	ØˆJˆJˆJˆJˆJøÝð 	ð 	ð 	ÝðGñô ð ð	øøøs   ‚ ˆ"c                 óp  — | j         rÖ|                      ¦   «         }|                      |¦  «        | _        |                      |¦  «        }g }|D ]Œ}| j        |z   }t          d|› �¦  «         |                      |¦  «        }t          j	        t          ¦  «        5  |                     |                      |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   Œ�|S t          d| j        › �¦  «         |                      ¦   «         }|                      |¦  «        | _        |                      |¦  «        S )zZLoad data into Document objects.

        Returns:
            List of Documents.
        zFetching documents from N)r   ÚscrapeÚ_get_folder_pathÚfolder_pathÚ
_get_pathsr   ÚprintÚ_scrapeÚ
contextlibÚsuppressÚ
ValueErrorÚextendÚ_get_documentsÚweb_path)r"   Ú	soup_infoÚrelative_pathsÚ	documentsÚpathÚurls         r$   ÚloadzBlackboardLoader.loadg   s}  € ð Ô$ð 	2ØŸš™œˆIØ#×4Ò4°YÑ?Ô?ˆDÔØ!Ÿ_š_¨YÑ7Ô7ˆNØˆIØ&ð Eð E�Ø”m dÑ*�ÝÐ6°Ð6Ð6Ñ7Ô7Ð7Ø ŸLšL¨Ñ-Ô-�	ÝÔ(­Ñ4Ô4ð Eð EØ×$Ò$ T×%8Ò%8¸Ñ%CÔ%CÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð EøàÐåÐ<¨T¬]Ð<Ð<Ñ=Ô=Ð=ØŸš™œˆIØ#×4Ò4°YÑ?Ô?ˆDÔØ×&Ò& yÑ1Ô1Ð1s   Â)CÃC	ÃC	Úsoupc                 ó&  — |                      dddi¦  «        }|€t          d¦  «        ‚|j                             ¦   «         }t	          |¦  «                             dd¦  «                             dd¦  «                             d	d¦  «                             d
d¦  «                             dd¦  «                             dd¦  «                             dd¦  «                             dd¦  «        }t          d¦  «        |z  }t          |¦  «        S )zžGet the folder path to save the Documents in.

        Args:
            soup: BeautifulSoup4 soup object.

        Returns:
            Folder path.
        ÚspanÚidÚcrumb_1NzNo course name found.ú Ú_ú/ú:ú,ú?ú'ú!ú"ú.)Úfindr2   ÚtextÚstripr   Úreplacer   Ústr)r"   r<   Úcourse_nameÚcourse_name_cleanr,   s        r$   r+   z!BlackboardLoader._get_folder_path   sð   € ð —i’i ¨¨yÐ(9Ñ:Ô:ˆØÐÝÐ4Ñ5Ô5Ð5Ø!Ô&×,Ò,Ñ.Ô.ˆõ �KÑ Ô ßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔßŠW�S˜#ÑÔð 	õ ˜3‘i”iÐ"3Ñ3ˆÝ�;ÑÔÐó    c                 ó‚   — |                       |¦  «        }|                      |¦  «         |                      ¦   «         }|S )z¤Fetch content from page and return Documents.

        Args:
            soup: BeautifulSoup4 soup object.

        Returns:
            List of documents.
        )Ú_get_attachmentsÚ_download_attachmentsÚ_load_documents)r"   r<   Úattachmentsr8   s       r$   r4   zBlackboardLoader._get_documents�   sB   € ð ×+Ò+¨DÑ1Ô1ˆØ×"Ò" ;Ñ/Ô/Ð/Ø×(Ò(Ñ*Ô*ˆ	ØÐrR   c                 óT  — ddl m}m} |                     dddi¦  «        }|€t	          d¦  «        ‚g }|                     dddi¦  «        D ][}|                     d	¦  «        D ]C}|                     d
¦  «        }|�*|                     d¦  «        s|                     |¦  «         ŒDŒ\|S )z™Get all attachments from a page.

        Args:
            soup: BeautifulSoup4 soup object.

        Returns:
            List of attachments.
        r   )ÚBeautifulSoupÚTagÚulÚclassÚcontentListNzNo content list found.rW   ÚaÚhrefú#)	r'   rY   rZ   rK   r2   Úfind_allÚgetÚ
startswithÚappend)	r"   r<   rY   rZ   Úcontent_listrW   Ú
attachmentÚlinkr_   s	            r$   rT   z!BlackboardLoader._get_attachments«   sÛ   € ð 	+Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð —y’y ¨°Ð'?Ñ@Ô@ˆØÐÝÐ5Ñ6Ô6Ð6àˆà&×/Ò/°°wÀÐ6NÑOÔOð 	-ð 	-ˆJà"×+Ò+¨CÑ0Ô0ð -ð -�Ø—x’x Ñ'Ô'�àÐ#¨D¯OªO¸CÑ,@Ô,@Ð#Ø×&Ò& tÑ,Ô,Ð,øð	-ð
 ÐrR   rW   c                 óŒ   — t          | j        ¦  «                             dd¬¦  «         |D ]}|                      |¦  «         ŒdS )z_Download all attachments.

        Args:
            attachments: List of attachments.
        T)ÚparentsÚexist_okN)r   r,   ÚmkdirÚdownload)r"   rW   rf   s      r$   rU   z&BlackboardLoader._download_attachmentsÇ   sV   € õ 	ˆTÔÑÔ×$Ò$¨T¸DÐ$ÑAÔAÐAà%ð 	&ð 	&ˆJØ�MŠM˜*Ñ%Ô%Ð%Ð%ð	&ð 	&rR   c                 óf   — t          | j        dt          ¬¦  «        }|                     ¦   «         }|S )z[Load all documents in the folder.

        Returns:
            List of documents.
        z*.pdf)r9   ÚglobÚ
loader_cls)r
   r,   r   r;   )r"   Úloaderr8   s      r$   rV   z BlackboardLoader._load_documentsÓ   s9   € õ !ØÔ!ØÝ"ð
ñ 
ô 
ˆð —K’K‘M”Mˆ	àÐrR   c                 ó  — g }|                      dddi¦  «        }|€t          d¦  «        ‚|                     d¦  «        D ]C}|                     d¦  «        }|�*|                     d¦  «        r|                     |¦  «         ŒD|S )	z%Get all relative paths in the navbar.r[   r\   Ú
courseMenuNzNo course menu found.r^   r_   rC   )rK   r2   ra   rb   rc   rd   )r"   r<   r7   Úcourse_menurg   r_   s         r$   r-   zBlackboardLoader._get_pathsä   s”   € àˆØ—i’i  w°Ð&=Ñ>Ô>ˆØÐÝÐ4Ñ5Ô5Ð5Ø×(Ò(¨Ñ-Ô-ð 	,ð 	,ˆDØ—8’8˜FÑ#Ô#ˆDØÐ D§O¢O°CÑ$8Ô$8ÐØ×%Ò% dÑ+Ô+Ð+øØÐrR   r9   c                 ó2  — | j                              | j        |z   d¬¦  «        }|                      |j        ¦  «        }t          t          | j        ¦  «        |z  d¦  «        5 }|                     |j	        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zXDownload a file from an url.

        Args:
            path: Path to the file.
        T)Úallow_redirectsÚwbN)
r   rb   r   Úparse_filenamer:   Úopenr   r,   ÚwriteÚcontent)r"   r9   ÚresponseÚfilenameÚfs        r$   rl   zBlackboardLoader.downloadð   sÐ   € ð ”<×#Ò# D¤M°DÑ$8È$Ð#ÑOÔOˆà×&Ò& x¤|Ñ4Ô4ˆå•$�tÔ'Ñ(Ô(¨8Ñ3°TÑ:Ô:ð 	&¸aØ�GŠG�HÔ$Ñ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 	&ð 	&s   Á$BÂBÂBr:   c                 ór   — t          |¦  «        x}r|j        dk    r|j        S |                      |¦  «        S )z”Parse the filename from an url.

        Args:
            url: Url to parse the filename from.

        Returns:
            The filename.
        ú.pdf)r   ÚsuffixÚnameÚ_parse_filename_from_url)r"   r:   Úurl_paths      r$   rw   zBlackboardLoader.parse_filenameþ   s?   € õ ˜S™	œ	Ð!ˆHð 	6 x¤¸&Ò'@Ð'@Ø”=Ð à×0Ò0°Ñ5Ô5Ð5rR   c                 ó6  — t          j        d|¦  «        }|r|                     d¦  «        }nt          d|› �¦  «        ‚d|vrt          d|› �¦  «        ‚|                     d¦  «        d         dz   }t          |¦  «        }|                     dd¦  «        }|S )	zâParse the filename from an url.

        Args:
            url: Url to parse the filename from.

        Returns:
            The filename.

        Raises:
            ValueError: If the filename could not be parsed.
        zfilename%2A%3DUTF-8%27%27(.+)é   zCould not parse filename from r   zIncorrect file type: r   z%20rA   )ÚreÚsearchÚgroupr2   r   r   rN   )r"   r:   Úfilename_matchesr|   s       r$   r‚   z)BlackboardLoader._parse_filename_from_url  s°   € õ œ9Ð%EÀsÑKÔKÐØð 	EØ'×-Ò-¨aÑ0Ô0ˆHˆHåÐC¸cÐCÐCÑDÔDÐDØ˜Ð!Ð!ÝÐ?°XÐ?Ð?Ñ@Ô@Ð@Ø—>’> &Ñ)Ô)¨!Ô,¨vÑ5ˆÝ˜8Ñ$Ô$ˆØ×#Ò# E¨3Ñ/Ô/ˆØˆrR   )TNNFT)r%   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   Úboolr   r   Údictr   r!   r   r	   r;   r   r+   r4   rT   rU   rV   r-   rl   rw   r‚   Ú__classcell__)r#   s   @r$   r   r      s%  ø€ € € € € ðð ð2 &*Ø04Ø"&Ø$)Ø"ð3ð 3à"ð3ð ð3ð #ð	3ð
 ˜U 3¨ 8œ_Ô-ð3ð ˜$”ð3ð "ð3ð ð3ð 3ð 3ð 3ð 3ð 3ðjð ð ð ð2�d˜8”nð 2ð 2ð 2ð 2ð0  Sð  ¨Sð  ð  ð  ð  ð< 3ð ¨4°¬>ð ð ð ð ð Sð ¨T°#¬Yð ð ð ð ð8
&°°c´ð 
&¸tð 
&ð 
&ð 
&ð 
&ð  h¤ð ð ð ð ð"
˜sð 
 t¨C¤yð 
ð 
ð 
ð 
ð&˜Sð & Tð &ð &ð &ð &ð6 #ð 6¨#ð 6ð 6ð 6ð 6ð¨Cð °Cð ð ð ð ð ð ð ð rR   r   Ú__main__z https://<YOUR BLACKBOARD URL HERE>/webapps/blackboard/content/listContent.jsp?course_id=_<YOUR COURSE ID HERE>_1&content_id=_<YOUR CONTENT ID HERE>_1&mode=resetz<YOUR BBROUTER COOKIE HERE>T)r   zLoaded z pages of PDFs from )r0   r†   Úpathlibr   Útypingr   r   r   r   Úurllib.parser   Úlangchain_core.documentsr	   Ú.langchain_community.document_loaders.directoryr
   Ú(langchain_community.document_loaders.pdfr   Ú-langchain_community.document_loaders.web_baser   r   rŠ   rp   r;   r8   r.   Úlenr5   © rR   r$   ú<module>r›      sW  ðØ Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø  Ð  Ð  Ð  Ð  Ð  à -Ð -Ð -Ð -Ð -Ð -à JÐ JÐ JÐ JÐ JÐ JØ @Ð @Ð @Ð @Ð @Ð @Ø GÐ GÐ GÐ GÐ GÐ GðTð Tð Tð Tð T�}ñ Tô Tð Tðn ˆzÒÐØÐð	Cð 	&Ø!ðñ ô €Fð —’‘”€IØ	€EÐ
I�C�C˜	‘N”NÐ
IÐ
I¸¼Ð
IÐ
IÑJÔJÐJÐJÐJð ÐrR   