tubefetcherlib


Nametubefetcherlib JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA modular and extensible Python library to fetch video stream URLs and metadata from various platforms.
upload_time2025-07-18 18:22:59
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords youtube instagram video stream metadata fetcher
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # TubeFetcherLib

![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)
![License](https://img.shields.io/badge/license-MIT-green.svg)
[![PyPI version](https://badge.fury.io/py/tubefetcherlib.svg)](https://badge.fury.io/py/tubefetcherlib)

A `TubeFetcherLib` é uma biblioteca Python modular e extensível projetada para extrair URLs de stream de vídeo e metadados de várias plataformas, começando com YouTube e Instagram. O objetivo é fornecer uma interface unificada para acessar informações de vídeo de diferentes provedores, permitindo fácil expansão para novas fontes no futuro.

## Funcionalidades

*   **Extração de URL de Stream:** Obtenha a URL direta do stream de vídeo para diferentes qualidades (quando disponível).
*   **Extração de Metadados:** Recupere informações detalhadas sobre o vídeo, como título, autor, duração, visualizações e URL da thumbnail.
*   **Suporte a Múltiplos Provedores:** Atualmente suporta YouTube e Instagram.
*   **Design Extensível:** Facilmente adiciona novos provedores de vídeo através de uma arquitetura baseada em Strategy Pattern.
*   **Configuração Flexível:** Gerenciamento centralizado de configurações como timeouts, retries e proxies.
*   **Tratamento de Erros Robusto:** Exceções personalizadas para diferentes cenários de falha.
*   **Logging Integrado:** Utiliza o módulo `logging` do Python para mensagens informativas e de depuração.

## Instalação

Você pode instalar `TubeFetcherLib` via pip:

```bash
pip install tubefetcherlib
```

## Uso

### Extraindo URL de Stream e Informações do Vídeo

A biblioteca oferece três funções principais para interagir com os provedores de vídeo: `get_video_stream_url`, `get_video_info` e `get_available_qualities`.

#### `get_video_stream_url(video_url: str, quality: StreamQuality = StreamQuality.HIGHEST, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> str`
Retorna a URL direta do stream de vídeo para a qualidade especificada.

*   `video_url` (str): A URL do vídeo (YouTube, Instagram, etc.).
*   `quality` (StreamQuality, opcional): A qualidade desejada do stream. Padrão para `StreamQuality.HIGHEST`.
*   `instagram_username` (str, opcional): Nome de usuário do Instagram para autenticação (necessário para conteúdo privado ou para evitar limitações de taxa).
*   `instagram_password` (str, opcional): Senha do Instagram para autenticação.
*   `config` (Config, opcional): Uma instância da classe `Config` para configurações personalizadas.

#### `get_video_info(video_url: str, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> Dict[str, Any]`
Retorna um dicionário contendo metadados detalhados do vídeo.

*   `video_url` (str): A URL do vídeo.
*   `instagram_username` (str, opcional): Nome de usuário do Instagram.
*   `instagram_password` (str, opcional): Senha do Instagram.
*   `config` (Config, opcional): Uma instância da classe `Config` para configurações personalizadas.

O dicionário retornado pode incluir chaves como `'title'`, `'author'`, `'duration'`, `'views'`, `'thumbnail_url'`, etc., dependendo do provedor.

#### `get_available_qualities(video_url: str, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> List[StreamQuality]`
Retorna uma lista de objetos `StreamQuality` que representam as qualidades de stream disponíveis para o vídeo.

*   `video_url` (str): A URL do vídeo.
*   `instagram_username` (str, opcional): Nome de usuário do Instagram.
*   `instagram_password` (str, opcional): Senha do Instagram.
*   `config` (Config, opcional): Uma instância da classe `Config` para configurações personalizadas.

### Enum `StreamQuality`

Define as qualidades de stream de vídeo disponíveis.

*   `HIGHEST`: A mais alta qualidade disponível.
*   `LOWEST`: A mais baixa qualidade disponível.
*   `P1080`: 1080p (Full HD).
*   `P720`: 720p (HD).
*   `P480`: 480p (SD).
*   `P360`: 360p (SD).
*   `P240`: 240p (SD).
*   `P144`: 144p (SD).

**Nota sobre o Instagram:** O Instagram geralmente oferece apenas uma qualidade de stream, que será mapeada para `StreamQuality.HIGHEST`. Solicitar outras qualidades pode resultar em `UnsupportedQualityError`.

### Classe `Config`

Permite configurar o comportamento da biblioteca, como timeouts, retries e proxies.

*   `instagram_session_dir` (str): Diretório onde o Instaloader (usado para Instagram) salvará/carregará os arquivos de sessão. Padrão: `.` (diretório atual).
*   `timeout` (int): Tempo limite em segundos para requisições de rede. Padrão: `30`.
*   `proxies` (Optional[Dict[str, str]]): Um dicionário de proxies para requisições HTTP/HTTPS. Ex: `{'http': 'http://user:pass@host:port', 'https': 'https://user:pass@host:port'}`. Padrão: `None`.
*   `retries` (int): Número de tentativas para requisições de rede falhas. Padrão: `3`.
*   `backoff_factor` (float): Fator para o backoff exponencial entre as tentativas. Padrão: `0.5`.

### Exemplos de Uso

```python
from tubefetcherlib.main import get_video_stream_url, get_video_info, get_available_qualities
from tubefetcherlib.providers.base import StreamQuality
from tubefetcherlib.config import Config
from tubefetcherlib.exceptions import VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError, ProviderAuthenticationError

# Exemplo de uso com YouTube
youtube_url = "https://www.youtube.com/watch?v=LXb3EKWsInQ" # Exemplo de vídeo de domínio público

try:
    # Obter a URL do stream na qualidade mais alta
    stream_url_highest = get_video_stream_url(youtube_url, quality=StreamQuality.HIGHEST)
    print(f"YouTube Stream URL (Highest): {stream_url_highest}")

    # Obter a URL do stream em 720p
    stream_url_720p = get_video_stream_url(youtube_url, quality=StreamQuality.P720)
    print(f"YouTube Stream URL (720p): {stream_url_720p}")

    # Obter informações do vídeo
    video_info = get_video_info(youtube_url)
    print(f"YouTube Video Info: {video_info['title']} by {video_info['author']}")

    # Obter qualidades disponíveis
    available_qualities = get_available_qualities(youtube_url)
    print(f"YouTube Available Qualities: {[q.value for q in available_qualities]}")

except (VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError) as e:
    print(f"Erro específico do YouTube: {e}")
except Exception as e:
    print(f"Erro inesperado ao processar vídeo do YouTube: {e}")

print("-" * 30)

# Exemplo de uso com Instagram (para conteúdo público)
# Note: O Instagram pode ter restrições de acesso sem autenticação.
instagram_url = "https://www.instagram.com/p/C71_y_1o_1o/" # Substitua por uma URL de vídeo real

try:
    # Obter a URL do stream (Instagram geralmente oferece apenas uma qualidade)
    stream_url_ig = get_video_stream_url(instagram_url)
    print(f"Instagram Stream URL: {stream_url_ig}")

    # Obter informações do vídeo
    video_info_ig = get_video_info(instagram_url)
    print(f"Instagram Video Info: {video_info_ig['title']} by {video_info_ig['author']}")

    # Obter qualidades disponíveis (Instagram geralmente retorna apenas HIGHEST)
    available_qualities_ig = get_available_qualities(instagram_url)
    print(f"Instagram Available Qualities: {[q.value for q in available_qualities_ig]}")

except (VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError) as e:
    print(f"Erro específico do Instagram: {e}")
except Exception as e:
    print(f"Erro inesperado ao processar vídeo do Instagram: {e}")

print("-" * 30)

# Exemplo de uso com configurações personalizadas (para Instagram com credenciais)
# É ALTAMENTE RECOMENDADO usar variáveis de ambiente ou um gerenciador de segredos
# para credenciais em ambientes de produção.
# Ex: export INSTAGRAM_USERNAME="seu_usuario"
#     export INSTAGRAM_PASSWORD="sua_senha"

import os

my_username = os.environ.get("INSTAGRAM_USERNAME")
my_password = os.environ.get("INSTAGRAM_PASSWORD")

if my_username and my_password:
    custom_config = Config(
        instagram_session_dir="./sessions", # Onde salvar/carregar a sessão do Instaloader
        timeout=90,
        retries=10,
        proxies={"http": "http://your.proxy.com:8080", "https": "https://your.proxy.com:8080"}
    )
    
    try:
        print("Tentando acessar Instagram com credenciais...")
        stream_url_ig_auth = get_video_stream_url(
            instagram_url,
            instagram_username=my_username,
            instagram_password=my_password,
            config=custom_config
        )
        print(f"Instagram Stream URL (Authenticated): {stream_url_ig_auth}")
    except ProviderAuthenticationError as e:
        print(f"Erro de autenticação do Instagram: {e}")
    except Exception as e:
        print(f"Erro inesperado ao processar vídeo do Instagram com credenciais: {e}")
else:
    print("Variáveis de ambiente INSTAGRAM_USERNAME e INSTAGRAM_PASSWORD não definidas. Pulando teste de autenticação do Instagram.")

```

### Tratamento de Erros

A biblioteca levanta exceções personalizadas para diferentes cenários de erro. É fundamental envolver as chamadas da biblioteca em blocos `try-except` para lidar com esses erros de forma robusta.

*   `VideoFetcherError`: Classe base para todas as exceções da biblioteca.
*   `VideoNotFoundError`: O vídeo não foi encontrado ou está indisponível.
*   `ProviderAuthenticationError`: Problemas de autenticação com o provedor (ex: credenciais inválidas para Instagram).
*   `StreamUnavailableError`: O stream solicitado não está disponível (ex: vídeo removido, restrição geográfica).
*   `UnsupportedQualityError`: A qualidade de stream solicitada não é suportada pelo provedor para o vídeo em questão.
*   `InvalidURLError`: A URL fornecida é inválida ou não pode ser processada por nenhum provedor conhecido.

```python
from tubefetcherlib.exceptions import VideoNotFoundError, InvalidURLError, ProviderAuthenticationError

try:
    # ... seu código de uso da biblioteca ...
    pass
except VideoNotFoundError as e:
    print(f"O vídeo não foi encontrado: {e}")
except InvalidURLError as e:
    print(f"A URL fornecida é inválida: {e}")
except ProviderAuthenticationError as e:
    print(f"Falha na autenticação com o provedor: {e}")
except Exception as e:
    print(f"Ocorreu um erro inesperado: {e}")
```

## Configuração para Desenvolvimento

Para configurar o ambiente de desenvolvimento e contribuir para a `TubeFetcherLib`, siga os passos abaixo:

1.  **Clone o repositório:**
    ```bash
    git clone https://github.com/heyjunin/tubefetcherlib.git
    cd tubefetcherlib
    ```

2.  **Crie e ative um ambiente virtual:**
    É altamente recomendado usar um ambiente virtual para isolar as dependências do projeto.
    ```bash
    python3 -m venv .venv
    source .venv/bin/activate
    ```

3.  **Instale as dependências de desenvolvimento:**
    ```bash
    pip install -e .
    pip install pytest
    ```
    O comando `pip install -e .` instala a biblioteca em modo "editável", o que significa que as alterações no código-fonte serão refletidas sem a necessidade de reinstalar.

4.  **Execute os testes:**
    Para garantir que suas alterações não introduziram regressões, execute os testes:
    ```bash
    pytest
    ```

## Contribuição

Contribuições são bem-vindas! Se você deseja contribuir para o `TubeFetcherLib`, por favor, siga estas diretrizes:

1.  Faça um fork do repositório.
2.  Crie uma nova branch para sua feature (`git checkout -b feature/AmazingFeature`).
3.  Faça suas alterações e certifique-se de que os testes passem.
4.  Commite suas alterações (`git commit -m 'Add some AmazingFeature'`).
5.  Envie para a branch (`git push origin feature/AmazingFeature`).
6.  Abra um Pull Request.

## Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.

## Contato

Para dúvidas ou suporte, por favor, abra uma issue no repositório do GitHub.

**Desenvolvido por:** heyjunin

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tubefetcherlib",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "youtube, instagram, video, stream, metadata, fetcher",
    "author": null,
    "author_email": "heyjunin <your.email@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/3b/94/6ed0dd36480e6f8aafdf17a7624d0c166f99eb824ad2d0330f415288cf05/tubefetcherlib-0.1.1.tar.gz",
    "platform": null,
    "description": "# TubeFetcherLib\n\n![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)\n![License](https://img.shields.io/badge/license-MIT-green.svg)\n[![PyPI version](https://badge.fury.io/py/tubefetcherlib.svg)](https://badge.fury.io/py/tubefetcherlib)\n\nA `TubeFetcherLib` \u00e9 uma biblioteca Python modular e extens\u00edvel projetada para extrair URLs de stream de v\u00eddeo e metadados de v\u00e1rias plataformas, come\u00e7ando com YouTube e Instagram. O objetivo \u00e9 fornecer uma interface unificada para acessar informa\u00e7\u00f5es de v\u00eddeo de diferentes provedores, permitindo f\u00e1cil expans\u00e3o para novas fontes no futuro.\n\n## Funcionalidades\n\n*   **Extra\u00e7\u00e3o de URL de Stream:** Obtenha a URL direta do stream de v\u00eddeo para diferentes qualidades (quando dispon\u00edvel).\n*   **Extra\u00e7\u00e3o de Metadados:** Recupere informa\u00e7\u00f5es detalhadas sobre o v\u00eddeo, como t\u00edtulo, autor, dura\u00e7\u00e3o, visualiza\u00e7\u00f5es e URL da thumbnail.\n*   **Suporte a M\u00faltiplos Provedores:** Atualmente suporta YouTube e Instagram.\n*   **Design Extens\u00edvel:** Facilmente adiciona novos provedores de v\u00eddeo atrav\u00e9s de uma arquitetura baseada em Strategy Pattern.\n*   **Configura\u00e7\u00e3o Flex\u00edvel:** Gerenciamento centralizado de configura\u00e7\u00f5es como timeouts, retries e proxies.\n*   **Tratamento de Erros Robusto:** Exce\u00e7\u00f5es personalizadas para diferentes cen\u00e1rios de falha.\n*   **Logging Integrado:** Utiliza o m\u00f3dulo `logging` do Python para mensagens informativas e de depura\u00e7\u00e3o.\n\n## Instala\u00e7\u00e3o\n\nVoc\u00ea pode instalar `TubeFetcherLib` via pip:\n\n```bash\npip install tubefetcherlib\n```\n\n## Uso\n\n### Extraindo URL de Stream e Informa\u00e7\u00f5es do V\u00eddeo\n\nA biblioteca oferece tr\u00eas fun\u00e7\u00f5es principais para interagir com os provedores de v\u00eddeo: `get_video_stream_url`, `get_video_info` e `get_available_qualities`.\n\n#### `get_video_stream_url(video_url: str, quality: StreamQuality = StreamQuality.HIGHEST, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> str`\nRetorna a URL direta do stream de v\u00eddeo para a qualidade especificada.\n\n*   `video_url` (str): A URL do v\u00eddeo (YouTube, Instagram, etc.).\n*   `quality` (StreamQuality, opcional): A qualidade desejada do stream. Padr\u00e3o para `StreamQuality.HIGHEST`.\n*   `instagram_username` (str, opcional): Nome de usu\u00e1rio do Instagram para autentica\u00e7\u00e3o (necess\u00e1rio para conte\u00fado privado ou para evitar limita\u00e7\u00f5es de taxa).\n*   `instagram_password` (str, opcional): Senha do Instagram para autentica\u00e7\u00e3o.\n*   `config` (Config, opcional): Uma inst\u00e2ncia da classe `Config` para configura\u00e7\u00f5es personalizadas.\n\n#### `get_video_info(video_url: str, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> Dict[str, Any]`\nRetorna um dicion\u00e1rio contendo metadados detalhados do v\u00eddeo.\n\n*   `video_url` (str): A URL do v\u00eddeo.\n*   `instagram_username` (str, opcional): Nome de usu\u00e1rio do Instagram.\n*   `instagram_password` (str, opcional): Senha do Instagram.\n*   `config` (Config, opcional): Uma inst\u00e2ncia da classe `Config` para configura\u00e7\u00f5es personalizadas.\n\nO dicion\u00e1rio retornado pode incluir chaves como `'title'`, `'author'`, `'duration'`, `'views'`, `'thumbnail_url'`, etc., dependendo do provedor.\n\n#### `get_available_qualities(video_url: str, instagram_username: str = None, instagram_password: str = None, config: Optional[Config] = None) -> List[StreamQuality]`\nRetorna uma lista de objetos `StreamQuality` que representam as qualidades de stream dispon\u00edveis para o v\u00eddeo.\n\n*   `video_url` (str): A URL do v\u00eddeo.\n*   `instagram_username` (str, opcional): Nome de usu\u00e1rio do Instagram.\n*   `instagram_password` (str, opcional): Senha do Instagram.\n*   `config` (Config, opcional): Uma inst\u00e2ncia da classe `Config` para configura\u00e7\u00f5es personalizadas.\n\n### Enum `StreamQuality`\n\nDefine as qualidades de stream de v\u00eddeo dispon\u00edveis.\n\n*   `HIGHEST`: A mais alta qualidade dispon\u00edvel.\n*   `LOWEST`: A mais baixa qualidade dispon\u00edvel.\n*   `P1080`: 1080p (Full HD).\n*   `P720`: 720p (HD).\n*   `P480`: 480p (SD).\n*   `P360`: 360p (SD).\n*   `P240`: 240p (SD).\n*   `P144`: 144p (SD).\n\n**Nota sobre o Instagram:** O Instagram geralmente oferece apenas uma qualidade de stream, que ser\u00e1 mapeada para `StreamQuality.HIGHEST`. Solicitar outras qualidades pode resultar em `UnsupportedQualityError`.\n\n### Classe `Config`\n\nPermite configurar o comportamento da biblioteca, como timeouts, retries e proxies.\n\n*   `instagram_session_dir` (str): Diret\u00f3rio onde o Instaloader (usado para Instagram) salvar\u00e1/carregar\u00e1 os arquivos de sess\u00e3o. Padr\u00e3o: `.` (diret\u00f3rio atual).\n*   `timeout` (int): Tempo limite em segundos para requisi\u00e7\u00f5es de rede. Padr\u00e3o: `30`.\n*   `proxies` (Optional[Dict[str, str]]): Um dicion\u00e1rio de proxies para requisi\u00e7\u00f5es HTTP/HTTPS. Ex: `{'http': 'http://user:pass@host:port', 'https': 'https://user:pass@host:port'}`. Padr\u00e3o: `None`.\n*   `retries` (int): N\u00famero de tentativas para requisi\u00e7\u00f5es de rede falhas. Padr\u00e3o: `3`.\n*   `backoff_factor` (float): Fator para o backoff exponencial entre as tentativas. Padr\u00e3o: `0.5`.\n\n### Exemplos de Uso\n\n```python\nfrom tubefetcherlib.main import get_video_stream_url, get_video_info, get_available_qualities\nfrom tubefetcherlib.providers.base import StreamQuality\nfrom tubefetcherlib.config import Config\nfrom tubefetcherlib.exceptions import VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError, ProviderAuthenticationError\n\n# Exemplo de uso com YouTube\nyoutube_url = \"https://www.youtube.com/watch?v=LXb3EKWsInQ\" # Exemplo de v\u00eddeo de dom\u00ednio p\u00fablico\n\ntry:\n    # Obter a URL do stream na qualidade mais alta\n    stream_url_highest = get_video_stream_url(youtube_url, quality=StreamQuality.HIGHEST)\n    print(f\"YouTube Stream URL (Highest): {stream_url_highest}\")\n\n    # Obter a URL do stream em 720p\n    stream_url_720p = get_video_stream_url(youtube_url, quality=StreamQuality.P720)\n    print(f\"YouTube Stream URL (720p): {stream_url_720p}\")\n\n    # Obter informa\u00e7\u00f5es do v\u00eddeo\n    video_info = get_video_info(youtube_url)\n    print(f\"YouTube Video Info: {video_info['title']} by {video_info['author']}\")\n\n    # Obter qualidades dispon\u00edveis\n    available_qualities = get_available_qualities(youtube_url)\n    print(f\"YouTube Available Qualities: {[q.value for q in available_qualities]}\")\n\nexcept (VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError) as e:\n    print(f\"Erro espec\u00edfico do YouTube: {e}\")\nexcept Exception as e:\n    print(f\"Erro inesperado ao processar v\u00eddeo do YouTube: {e}\")\n\nprint(\"-\" * 30)\n\n# Exemplo de uso com Instagram (para conte\u00fado p\u00fablico)\n# Note: O Instagram pode ter restri\u00e7\u00f5es de acesso sem autentica\u00e7\u00e3o.\ninstagram_url = \"https://www.instagram.com/p/C71_y_1o_1o/\" # Substitua por uma URL de v\u00eddeo real\n\ntry:\n    # Obter a URL do stream (Instagram geralmente oferece apenas uma qualidade)\n    stream_url_ig = get_video_stream_url(instagram_url)\n    print(f\"Instagram Stream URL: {stream_url_ig}\")\n\n    # Obter informa\u00e7\u00f5es do v\u00eddeo\n    video_info_ig = get_video_info(instagram_url)\n    print(f\"Instagram Video Info: {video_info_ig['title']} by {video_info_ig['author']}\")\n\n    # Obter qualidades dispon\u00edveis (Instagram geralmente retorna apenas HIGHEST)\n    available_qualities_ig = get_available_qualities(instagram_url)\n    print(f\"Instagram Available Qualities: {[q.value for q in available_qualities_ig]}\")\n\nexcept (VideoNotFoundError, InvalidURLError, StreamUnavailableError, UnsupportedQualityError) as e:\n    print(f\"Erro espec\u00edfico do Instagram: {e}\")\nexcept Exception as e:\n    print(f\"Erro inesperado ao processar v\u00eddeo do Instagram: {e}\")\n\nprint(\"-\" * 30)\n\n# Exemplo de uso com configura\u00e7\u00f5es personalizadas (para Instagram com credenciais)\n# \u00c9 ALTAMENTE RECOMENDADO usar vari\u00e1veis de ambiente ou um gerenciador de segredos\n# para credenciais em ambientes de produ\u00e7\u00e3o.\n# Ex: export INSTAGRAM_USERNAME=\"seu_usuario\"\n#     export INSTAGRAM_PASSWORD=\"sua_senha\"\n\nimport os\n\nmy_username = os.environ.get(\"INSTAGRAM_USERNAME\")\nmy_password = os.environ.get(\"INSTAGRAM_PASSWORD\")\n\nif my_username and my_password:\n    custom_config = Config(\n        instagram_session_dir=\"./sessions\", # Onde salvar/carregar a sess\u00e3o do Instaloader\n        timeout=90,\n        retries=10,\n        proxies={\"http\": \"http://your.proxy.com:8080\", \"https\": \"https://your.proxy.com:8080\"}\n    )\n    \n    try:\n        print(\"Tentando acessar Instagram com credenciais...\")\n        stream_url_ig_auth = get_video_stream_url(\n            instagram_url,\n            instagram_username=my_username,\n            instagram_password=my_password,\n            config=custom_config\n        )\n        print(f\"Instagram Stream URL (Authenticated): {stream_url_ig_auth}\")\n    except ProviderAuthenticationError as e:\n        print(f\"Erro de autentica\u00e7\u00e3o do Instagram: {e}\")\n    except Exception as e:\n        print(f\"Erro inesperado ao processar v\u00eddeo do Instagram com credenciais: {e}\")\nelse:\n    print(\"Vari\u00e1veis de ambiente INSTAGRAM_USERNAME e INSTAGRAM_PASSWORD n\u00e3o definidas. Pulando teste de autentica\u00e7\u00e3o do Instagram.\")\n\n```\n\n### Tratamento de Erros\n\nA biblioteca levanta exce\u00e7\u00f5es personalizadas para diferentes cen\u00e1rios de erro. \u00c9 fundamental envolver as chamadas da biblioteca em blocos `try-except` para lidar com esses erros de forma robusta.\n\n*   `VideoFetcherError`: Classe base para todas as exce\u00e7\u00f5es da biblioteca.\n*   `VideoNotFoundError`: O v\u00eddeo n\u00e3o foi encontrado ou est\u00e1 indispon\u00edvel.\n*   `ProviderAuthenticationError`: Problemas de autentica\u00e7\u00e3o com o provedor (ex: credenciais inv\u00e1lidas para Instagram).\n*   `StreamUnavailableError`: O stream solicitado n\u00e3o est\u00e1 dispon\u00edvel (ex: v\u00eddeo removido, restri\u00e7\u00e3o geogr\u00e1fica).\n*   `UnsupportedQualityError`: A qualidade de stream solicitada n\u00e3o \u00e9 suportada pelo provedor para o v\u00eddeo em quest\u00e3o.\n*   `InvalidURLError`: A URL fornecida \u00e9 inv\u00e1lida ou n\u00e3o pode ser processada por nenhum provedor conhecido.\n\n```python\nfrom tubefetcherlib.exceptions import VideoNotFoundError, InvalidURLError, ProviderAuthenticationError\n\ntry:\n    # ... seu c\u00f3digo de uso da biblioteca ...\n    pass\nexcept VideoNotFoundError as e:\n    print(f\"O v\u00eddeo n\u00e3o foi encontrado: {e}\")\nexcept InvalidURLError as e:\n    print(f\"A URL fornecida \u00e9 inv\u00e1lida: {e}\")\nexcept ProviderAuthenticationError as e:\n    print(f\"Falha na autentica\u00e7\u00e3o com o provedor: {e}\")\nexcept Exception as e:\n    print(f\"Ocorreu um erro inesperado: {e}\")\n```\n\n## Configura\u00e7\u00e3o para Desenvolvimento\n\nPara configurar o ambiente de desenvolvimento e contribuir para a `TubeFetcherLib`, siga os passos abaixo:\n\n1.  **Clone o reposit\u00f3rio:**\n    ```bash\n    git clone https://github.com/heyjunin/tubefetcherlib.git\n    cd tubefetcherlib\n    ```\n\n2.  **Crie e ative um ambiente virtual:**\n    \u00c9 altamente recomendado usar um ambiente virtual para isolar as depend\u00eancias do projeto.\n    ```bash\n    python3 -m venv .venv\n    source .venv/bin/activate\n    ```\n\n3.  **Instale as depend\u00eancias de desenvolvimento:**\n    ```bash\n    pip install -e .\n    pip install pytest\n    ```\n    O comando `pip install -e .` instala a biblioteca em modo \"edit\u00e1vel\", o que significa que as altera\u00e7\u00f5es no c\u00f3digo-fonte ser\u00e3o refletidas sem a necessidade de reinstalar.\n\n4.  **Execute os testes:**\n    Para garantir que suas altera\u00e7\u00f5es n\u00e3o introduziram regress\u00f5es, execute os testes:\n    ```bash\n    pytest\n    ```\n\n## Contribui\u00e7\u00e3o\n\nContribui\u00e7\u00f5es s\u00e3o bem-vindas! Se voc\u00ea deseja contribuir para o `TubeFetcherLib`, por favor, siga estas diretrizes:\n\n1.  Fa\u00e7a um fork do reposit\u00f3rio.\n2.  Crie uma nova branch para sua feature (`git checkout -b feature/AmazingFeature`).\n3.  Fa\u00e7a suas altera\u00e7\u00f5es e certifique-se de que os testes passem.\n4.  Commite suas altera\u00e7\u00f5es (`git commit -m 'Add some AmazingFeature'`).\n5.  Envie para a branch (`git push origin feature/AmazingFeature`).\n6.  Abra um Pull Request.\n\n## Licen\u00e7a\n\nEste projeto est\u00e1 licenciado sob a Licen\u00e7a MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.\n\n## Contato\n\nPara d\u00favidas ou suporte, por favor, abra uma issue no reposit\u00f3rio do GitHub.\n\n**Desenvolvido por:** heyjunin\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A modular and extensible Python library to fetch video stream URLs and metadata from various platforms.",
    "version": "0.1.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/heyjunin/tubefetcherlib/issues",
        "Homepage": "https://github.com/heyjunin/tubefetcherlib"
    },
    "split_keywords": [
        "youtube",
        " instagram",
        " video",
        " stream",
        " metadata",
        " fetcher"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "57a6e56d9160fd356dd174ebd450e1da26bbec100cbe00339bda45eeb806ba11",
                "md5": "a267862010d6ec382f6da18037b97e8d",
                "sha256": "0e36dedd677380fa93a61a00fe31f00a6e52ce86680cdf40a6a140bf3631ac58"
            },
            "downloads": -1,
            "filename": "tubefetcherlib-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a267862010d6ec382f6da18037b97e8d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 16953,
            "upload_time": "2025-07-18T18:22:58",
            "upload_time_iso_8601": "2025-07-18T18:22:58.756456Z",
            "url": "https://files.pythonhosted.org/packages/57/a6/e56d9160fd356dd174ebd450e1da26bbec100cbe00339bda45eeb806ba11/tubefetcherlib-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3b946ed0dd36480e6f8aafdf17a7624d0c166f99eb824ad2d0330f415288cf05",
                "md5": "5b850c07b88d688b7489b477f9ad22ff",
                "sha256": "5d45db548b52d5a48c004467fdb86ed7cfa18a6e11379ce22cff7289f10816ec"
            },
            "downloads": -1,
            "filename": "tubefetcherlib-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "5b850c07b88d688b7489b477f9ad22ff",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 16795,
            "upload_time": "2025-07-18T18:22:59",
            "upload_time_iso_8601": "2025-07-18T18:22:59.882923Z",
            "url": "https://files.pythonhosted.org/packages/3b/94/6ed0dd36480e6f8aafdf17a7624d0c166f99eb824ad2d0330f415288cf05/tubefetcherlib-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-18 18:22:59",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "heyjunin",
    "github_project": "tubefetcherlib",
    "github_not_found": true,
    "lcname": "tubefetcherlib"
}
        
Elapsed time: 1.05350s