pyzbrowser 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyzbrowser/__init__.py +47 -0
- pyzbrowser/__main__.py +9 -0
- pyzbrowser/routes.py +636 -0
- pyzbrowser/templates/index.html +567 -0
- pyzbrowser/utils.py +120 -0
- pyzbrowser-1.0.0.dist-info/METADATA +313 -0
- pyzbrowser-1.0.0.dist-info/RECORD +10 -0
- pyzbrowser-1.0.0.dist-info/WHEEL +5 -0
- pyzbrowser-1.0.0.dist-info/entry_points.txt +2 -0
- pyzbrowser-1.0.0.dist-info/top_level.txt +1 -0
pyzbrowser/utils.py
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# Carregar pastas raiz da variável de ambiente ou usar padrão
|
|
7
|
+
# Formato da variável PYBROWSER_ROOTS: caminhos separados por vírgula
|
|
8
|
+
# Exemplo: PYBROWSER_ROOTS=C:\Users\p0666678\Downloads,C:\Users\p0666678\Documents,D:\Projetos
|
|
9
|
+
# O nome de cada pasta será extraído automaticamente do caminho
|
|
10
|
+
def load_root_dirs():
|
|
11
|
+
env_roots = os.environ.get("PYBROWSER_ROOTS")
|
|
12
|
+
|
|
13
|
+
# SE O USUARIO COLOCOU O PARAMETRO EM SYS ARGS -r
|
|
14
|
+
if "-r" in sys.argv:
|
|
15
|
+
index = sys.argv.index("-r")
|
|
16
|
+
if index + 1 < len(sys.argv):
|
|
17
|
+
env_roots = sys.argv[index + 1]
|
|
18
|
+
|
|
19
|
+
if env_roots:
|
|
20
|
+
# Formato simples: caminhos separados por vírgula
|
|
21
|
+
paths = [p.strip() for p in env_roots.split(";") if p.strip()]
|
|
22
|
+
|
|
23
|
+
if paths:
|
|
24
|
+
result = []
|
|
25
|
+
for path_str in paths:
|
|
26
|
+
# Resolver o caminho completo
|
|
27
|
+
path_obj = Path(path_str).resolve()
|
|
28
|
+
# Usar o nome da pasta como nome de exibição
|
|
29
|
+
folder_name = Path(
|
|
30
|
+
path_obj
|
|
31
|
+
).name # Passamos novamente por PAth caso a pasta original nao tenha nome
|
|
32
|
+
result.append((folder_name, str(path_obj)))
|
|
33
|
+
|
|
34
|
+
if result:
|
|
35
|
+
print(f"Usando pastas raiz: {', '.join([name for name, _ in result])}")
|
|
36
|
+
return result
|
|
37
|
+
|
|
38
|
+
# Detectar automaticamente a pasta Downloads do usuário atual
|
|
39
|
+
downloads_path = os.path.join(os.path.expanduser("~"), "Downloads")
|
|
40
|
+
return [
|
|
41
|
+
("Downloads", downloads_path),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_root_dir(root_name, ROOT_DIRS):
|
|
46
|
+
"""Retorna o caminho completo de uma pasta raiz pelo nome"""
|
|
47
|
+
for name, path in ROOT_DIRS:
|
|
48
|
+
if name == root_name:
|
|
49
|
+
return path
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_root_name_from_path(subpath):
|
|
54
|
+
"""Extrai o nome da raiz do subpath"""
|
|
55
|
+
if not subpath:
|
|
56
|
+
return None
|
|
57
|
+
parts = subpath.split("/", 1)
|
|
58
|
+
return parts[0] if parts else None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def remove_root_from_path(subpath):
|
|
62
|
+
"""Remove o nome da raiz do subpath"""
|
|
63
|
+
if not subpath:
|
|
64
|
+
return ""
|
|
65
|
+
parts = subpath.split("/", 1)
|
|
66
|
+
return parts[1] if len(parts) > 1 else ""
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def get_file_icon(filename, is_dir):
|
|
70
|
+
"""Retorna o emoji apropriado baseado no tipo de arquivo"""
|
|
71
|
+
if is_dir:
|
|
72
|
+
return "📁"
|
|
73
|
+
|
|
74
|
+
ext = os.path.splitext(filename)[1].lower()
|
|
75
|
+
|
|
76
|
+
# Imagens
|
|
77
|
+
if ext in [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp", ".ico"]:
|
|
78
|
+
return "🖼️"
|
|
79
|
+
# Vídeos
|
|
80
|
+
elif ext in [".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm"]:
|
|
81
|
+
return "🎬"
|
|
82
|
+
# Áudio
|
|
83
|
+
elif ext in [".mp3", ".wav", ".flac", ".aac", ".ogg", ".m4a", ".wma"]:
|
|
84
|
+
return "🎵"
|
|
85
|
+
# Documentos
|
|
86
|
+
elif ext in [".pdf"]:
|
|
87
|
+
return "📕"
|
|
88
|
+
elif ext in [".doc", ".docx"]:
|
|
89
|
+
return "📘"
|
|
90
|
+
elif ext in [".xls", ".xlsx", ".csv"]:
|
|
91
|
+
return "📊"
|
|
92
|
+
elif ext in [".ppt", ".pptx"]:
|
|
93
|
+
return "📙"
|
|
94
|
+
# Compactados
|
|
95
|
+
elif ext in [".zip", ".rar", ".7z", ".tar", ".gz", ".bz2"]:
|
|
96
|
+
return "🗜️"
|
|
97
|
+
# Código
|
|
98
|
+
elif ext in [".py"]:
|
|
99
|
+
return "🐍"
|
|
100
|
+
elif ext in [".js", ".jsx", ".ts", ".tsx"]:
|
|
101
|
+
return "📜"
|
|
102
|
+
elif ext in [".html", ".htm"]:
|
|
103
|
+
return "🌐"
|
|
104
|
+
elif ext in [".css", ".scss", ".sass"]:
|
|
105
|
+
return "🎨"
|
|
106
|
+
elif ext in [".java"]:
|
|
107
|
+
return "☕"
|
|
108
|
+
elif ext in [".c", ".cpp", ".h", ".hpp"]:
|
|
109
|
+
return "⚙️"
|
|
110
|
+
elif ext in [".json", ".xml", ".yaml", ".yml"]:
|
|
111
|
+
return "📋"
|
|
112
|
+
# Texto
|
|
113
|
+
elif ext in [".txt", ".md", ".log"]:
|
|
114
|
+
return "📝"
|
|
115
|
+
# Executáveis
|
|
116
|
+
elif ext in [".exe", ".msi", ".app", ".dmg"]:
|
|
117
|
+
return "⚡"
|
|
118
|
+
# Padrão
|
|
119
|
+
else:
|
|
120
|
+
return "📄"
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyzbrowser
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Library to create a file browser interface in browser using Python.
|
|
5
|
+
Home-page:
|
|
6
|
+
Author:
|
|
7
|
+
Author-email:
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: pyzbrowser
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Intended Audience :: Education
|
|
12
|
+
Classifier: Operating System :: Microsoft :: Windows :: Windows 10
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
Requires-Dist: Flask==3.0.3
|
|
17
|
+
Requires-Dist: zipstream-new==1.1.8
|
|
18
|
+
Dynamic: classifier
|
|
19
|
+
Dynamic: description
|
|
20
|
+
Dynamic: description-content-type
|
|
21
|
+
Dynamic: keywords
|
|
22
|
+
Dynamic: license
|
|
23
|
+
Dynamic: requires-dist
|
|
24
|
+
Dynamic: summary
|
|
25
|
+
|
|
26
|
+
# 🐍 PyMyFileBrowser
|
|
27
|
+
|
|
28
|
+
[](https://www.python.org/downloads/)
|
|
29
|
+
[](LICENSE)
|
|
30
|
+
[](https://flask.palletsprojects.com/)
|
|
31
|
+
|
|
32
|
+
**PyMyFileBrowser** é um gerenciador de arquivos web poderoso e intuitivo desenvolvido em Python com Flask. Navegue, gerencie e visualize seus arquivos através de uma interface web moderna e responsiva, acessível de qualquer navegador.
|
|
33
|
+
|
|
34
|
+
## ✨ Características Principais
|
|
35
|
+
|
|
36
|
+
### 🗂️ Gerenciamento de Arquivos
|
|
37
|
+
- **Navegação Intuitiva**: Interface limpa inspirada em gerenciadores de arquivos modernos
|
|
38
|
+
- **Upload de Arquivos**: Suporte para upload único e múltiplo, incluindo pastas completas (drag & drop)
|
|
39
|
+
- **Download Inteligente**: Download individual ou múltiplo com compressão automática em ZIP
|
|
40
|
+
- **Criação de Pastas**: Crie novas pastas diretamente pela interface
|
|
41
|
+
- **Exclusão Segura**: Remova arquivos e pastas com confirmação
|
|
42
|
+
|
|
43
|
+
### 🔍 Busca e Organização
|
|
44
|
+
- **Busca Local**: Filtro rápido por nome na pasta atual
|
|
45
|
+
- **Busca Global**: Busca avançada recursiva em todas as pastas configuradas
|
|
46
|
+
- **Ordenação Flexível**: Ordene por nome, data ou tipo de arquivo
|
|
47
|
+
- **Ícones Inteligentes**: Identificação visual automática por tipo de arquivo (imagens, vídeos, código, documentos, etc.)
|
|
48
|
+
|
|
49
|
+
### 👁️ Visualização de Arquivos
|
|
50
|
+
Suporte nativo para visualização de diversos formatos:
|
|
51
|
+
- **Imagens**: JPG, PNG, GIF, BMP, SVG, WebP, ICO
|
|
52
|
+
- **Vídeos**: MP4, WebM, OGG
|
|
53
|
+
- **Áudio**: MP3, WAV, OGG, M4A
|
|
54
|
+
- **Documentos**: PDF
|
|
55
|
+
- **Código**: Python, JavaScript, HTML, CSS, JSON, XML, C/C++, Java e mais
|
|
56
|
+
- **Texto**: TXT, MD, LOG, INI
|
|
57
|
+
|
|
58
|
+
### 🚀 Recursos Avançados
|
|
59
|
+
- **Múltiplas Raízes**: Configure várias pastas raiz independentes via variável de ambiente
|
|
60
|
+
- **Compressão Streaming**: Download de pastas grandes com streaming ZIP (sem consumir memória)
|
|
61
|
+
- **Seleção Múltipla**: Selecione e baixe múltiplos arquivos/pastas de uma vez
|
|
62
|
+
- **Data de Criação**: Visualize quando cada arquivo foi criado
|
|
63
|
+
- **Responsivo**: Interface adaptável para desktop, tablet e mobile
|
|
64
|
+
- **Hostname Display**: Identifique facilmente qual servidor você está acessando
|
|
65
|
+
|
|
66
|
+
## 📋 Requisitos
|
|
67
|
+
|
|
68
|
+
- Python 3.6 ou superior
|
|
69
|
+
- Flask 3.0.3
|
|
70
|
+
- zipstream-new 1.1.8
|
|
71
|
+
|
|
72
|
+
## 📦 Instalação
|
|
73
|
+
|
|
74
|
+
### Instalação via pip (Recomendado)
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pip install pymyfilebrowser
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Instalação para Desenvolvimento
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Clone o repositório
|
|
84
|
+
git clone https://github.com/seu-usuario/pymyfilebrowser.git
|
|
85
|
+
cd pymyfilebrowser
|
|
86
|
+
|
|
87
|
+
# Instale em modo desenvolvimento
|
|
88
|
+
pip install -e .
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Instalação Manual
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Clone o repositório
|
|
95
|
+
git clone https://github.com/seu-usuario/pymyfilebrowser.git
|
|
96
|
+
cd pymyfilebrowser
|
|
97
|
+
|
|
98
|
+
# Instale as dependências
|
|
99
|
+
pip install -r requirements.txt
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## ⚙️ Configuração
|
|
103
|
+
|
|
104
|
+
### Pastas Raiz
|
|
105
|
+
|
|
106
|
+
Por padrão, o PyMyFileBrowser usa a pasta **Downloads** do usuário atual. Para configurar pastas personalizadas, defina a variável de ambiente `PYBROWSER_ROOTS`:
|
|
107
|
+
|
|
108
|
+
#### Windows (PowerShell)
|
|
109
|
+
```powershell
|
|
110
|
+
$env:PYBROWSER_ROOTS='C:\Users\SeuUsuario\Downloads,C:\Users\SeuUsuario\Documents,D:\Projetos'
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
#### Windows (CMD)
|
|
114
|
+
```cmd
|
|
115
|
+
set PYBROWSER_ROOTS=C:\Users\SeuUsuario\Downloads,C:\Users\SeuUsuario\Documents,D:\Projetos
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### Linux/macOS
|
|
119
|
+
```bash
|
|
120
|
+
export PYBROWSER_ROOTS='/home/usuario/Downloads,/home/usuario/Documents,/var/www/projetos'
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### Formato da Variável
|
|
124
|
+
|
|
125
|
+
A variável `PYBROWSER_ROOTS` deve conter **caminhos separados por vírgula**. O nome de cada pasta será extraído automaticamente do caminho.
|
|
126
|
+
|
|
127
|
+
**Exemplos:**
|
|
128
|
+
|
|
129
|
+
Windows:
|
|
130
|
+
```
|
|
131
|
+
PYBROWSER_ROOTS=C:\Users\John\Downloads,C:\Users\John\Documents,D:\Development\Projects
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Linux/macOS:
|
|
135
|
+
```
|
|
136
|
+
PYBROWSER_ROOTS=/home/john/Downloads,/home/john/Documents,/var/www/projects
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
> **Nota**: O nome exibido será o nome da pasta final no caminho. Por exemplo, `C:\Users\John\Downloads` será exibido como "Downloads".
|
|
140
|
+
|
|
141
|
+
#### Uso com Argumento -r
|
|
142
|
+
|
|
143
|
+
Você também pode especificar uma pasta diretamente ao executar:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
python -m pymyfilebrowser -r C:\MinhaPasta
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
ou
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
pymyfilebrowser -r /home/usuario/meus-arquivos
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 🚀 Uso
|
|
156
|
+
|
|
157
|
+
### Executar como Módulo Python (Recomendado)
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
python -m pymyfilebrowser
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Executar via Comando Instalado
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pymyfilebrowser
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Executar Diretamente (Desenvolvimento)
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
python run.py
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Após iniciar, acesse em seu navegador:
|
|
176
|
+
```
|
|
177
|
+
http://localhost:5000
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Para acessar de outros dispositivos na rede:
|
|
181
|
+
```
|
|
182
|
+
http://[IP-DO-SEU-PC]:5000
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## 🎯 Como Usar
|
|
186
|
+
|
|
187
|
+
### Navegação Básica
|
|
188
|
+
1. Ao abrir, você verá as pastas raiz configuradas
|
|
189
|
+
2. Clique em uma pasta para navegar
|
|
190
|
+
3. Use o breadcrumb no topo para voltar
|
|
191
|
+
4. Use os botões de navegação (Voltar/Home) no topo direito
|
|
192
|
+
|
|
193
|
+
### Upload de Arquivos
|
|
194
|
+
1. Navegue até a pasta de destino
|
|
195
|
+
2. Clique no botão **📤 Upload** (canto superior direito)
|
|
196
|
+
3. Escolha "Arquivos" ou "Pasta"
|
|
197
|
+
4. Selecione os arquivos/pasta desejados
|
|
198
|
+
5. Aguarde o upload e clique em "Concluir"
|
|
199
|
+
|
|
200
|
+
### Download de Arquivos
|
|
201
|
+
1. **Download Individual**: Clique no ícone 📥 ao lado do arquivo
|
|
202
|
+
2. **Download Múltiplo**:
|
|
203
|
+
- Marque as caixas de seleção dos itens desejados
|
|
204
|
+
- Clique no botão verde que aparece no topo
|
|
205
|
+
- Arquivos múltiplos são automaticamente compactados em ZIP
|
|
206
|
+
|
|
207
|
+
### Busca de Arquivos
|
|
208
|
+
1. **Busca Local**: Digite na caixa de busca no topo da lista
|
|
209
|
+
2. **Busca Global**: Clique no ícone 🔍 (Busca Avançada)
|
|
210
|
+
- Digite o termo de busca
|
|
211
|
+
- Aguarde os resultados
|
|
212
|
+
- Clique em qualquer resultado para navegar até o arquivo
|
|
213
|
+
|
|
214
|
+
### Criar Pasta
|
|
215
|
+
1. Navegue até onde deseja criar a pasta
|
|
216
|
+
2. Clique no botão **📁+** (canto superior direito)
|
|
217
|
+
3. Digite o nome da pasta
|
|
218
|
+
4. Confirme
|
|
219
|
+
|
|
220
|
+
### Excluir Arquivo/Pasta
|
|
221
|
+
1. Clique no ícone 🗑️ ao lado do item
|
|
222
|
+
2. Confirme a exclusão
|
|
223
|
+
3. ⚠️ **Atenção**: Esta ação é irreversível!
|
|
224
|
+
|
|
225
|
+
### Visualizar Arquivo
|
|
226
|
+
1. Clique no ícone 👁️ ao lado do arquivo
|
|
227
|
+
2. O arquivo será aberto em uma modal de visualização
|
|
228
|
+
3. Use os controles nativos para imagens, vídeos e áudios
|
|
229
|
+
|
|
230
|
+
### Ordenação
|
|
231
|
+
Use os botões no topo da lista:
|
|
232
|
+
- **Nome**: Ordem alfabética (pastas primeiro)
|
|
233
|
+
- **Data**: Mais recentes primeiro
|
|
234
|
+
- **Tipo**: Agrupado por extensão
|
|
235
|
+
|
|
236
|
+
## 📁 Estrutura do Projeto
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
pymyfilebrowser/
|
|
240
|
+
│
|
|
241
|
+
├── pyMyFileBrowser/ # Pacote principal
|
|
242
|
+
│ ├── __init__.py # Aplicação Flask e rotas
|
|
243
|
+
│ ├── __main__.py # Entry point para python -m
|
|
244
|
+
│ └── templates/ # Templates HTML
|
|
245
|
+
│ └── index.html # Interface principal
|
|
246
|
+
│
|
|
247
|
+
├── setup.py # Configuração do pacote
|
|
248
|
+
├── MANIFEST.in # Arquivos para incluir no pacote
|
|
249
|
+
├── requirements.txt # Dependências
|
|
250
|
+
├── CHANGELOG.txt # Histórico de versões
|
|
251
|
+
├── README.md # Este arquivo
|
|
252
|
+
└── run.py # Script de execução direta
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## 🛠️ Desenvolvimento
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
|
|
259
|
+
## 🔒 Segurança
|
|
260
|
+
|
|
261
|
+
- **Path Traversal Protection**: O sistema valida todos os caminhos para evitar acesso fora das pastas raiz
|
|
262
|
+
- **Filename Sanitization**: Nomes de arquivos são sanitizados usando `secure_filename()` do Werkzeug
|
|
263
|
+
- **Input Validation**: Validação em todas as rotas POST
|
|
264
|
+
- **⚠️ Aviso**: Este sistema foi projetado para uso em redes locais confiáveis. **NÃO exponha diretamente à internet sem autenticação adequada**
|
|
265
|
+
|
|
266
|
+
## 🤝 Contribuindo
|
|
267
|
+
|
|
268
|
+
Contribuições são bem-vindas! Para contribuir:
|
|
269
|
+
|
|
270
|
+
1. Faça um Fork do projeto
|
|
271
|
+
2. Crie uma branch para sua feature (`git checkout -b feature/NovaFeature`)
|
|
272
|
+
3. Commit suas mudanças (`git commit -m 'Adiciona nova feature'`)
|
|
273
|
+
4. Push para a branch (`git push origin feature/NovaFeature`)
|
|
274
|
+
5. Abra um Pull Request
|
|
275
|
+
|
|
276
|
+
## 📝 Licença
|
|
277
|
+
|
|
278
|
+
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
|
|
279
|
+
|
|
280
|
+
## 🐛 Reportar Bugs
|
|
281
|
+
|
|
282
|
+
Encontrou um bug? Por favor, abra uma [issue](https://github.com/seu-usuario/pymyfilebrowser/issues) com:
|
|
283
|
+
- Descrição do problema
|
|
284
|
+
- Passos para reproduzir
|
|
285
|
+
- Comportamento esperado vs atual
|
|
286
|
+
- Screenshots (se aplicável)
|
|
287
|
+
- Informações do sistema (OS, versão do Python)
|
|
288
|
+
|
|
289
|
+
## 💡 Roadmap
|
|
290
|
+
|
|
291
|
+
- [ ] Autenticação de usuários
|
|
292
|
+
- [ ] Suporte a temas (claro/escuro)
|
|
293
|
+
- [ ] Editor de texto integrado
|
|
294
|
+
- [ ] Visualização de mais formatos (Office, etc.)
|
|
295
|
+
- [ ] Compartilhamento de links temporários
|
|
296
|
+
- [ ] Upload com barra de progresso
|
|
297
|
+
- [ ] Preview de thumbnails para imagens
|
|
298
|
+
- [ ] Drag & drop para reorganizar arquivos
|
|
299
|
+
|
|
300
|
+
## 📧 Contato
|
|
301
|
+
|
|
302
|
+
Para questões, sugestões ou feedback, entre em contato através das issues do GitHub.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
**Desenvolvido com ❤️ e 🐍 Python**
|
|
307
|
+
|
|
308
|
+
Change Log
|
|
309
|
+
==========
|
|
310
|
+
|
|
311
|
+
1.0.0 (2026-02-02)
|
|
312
|
+
------------------
|
|
313
|
+
- First Release
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
pyzbrowser/__init__.py,sha256=zoQ2JzUkOUY6GQqbJtX7CuAJueIjctQvUkiW2DycXbY,1031
|
|
2
|
+
pyzbrowser/__main__.py,sha256=1Hnw64yaTYHuSlLk9LQgcs4pNgfifxftoJgNEJHfcbw,153
|
|
3
|
+
pyzbrowser/routes.py,sha256=cq1L-u9397GpBywzTJ_xqBpyve7KLhDAGJlzq6ufl54,19845
|
|
4
|
+
pyzbrowser/utils.py,sha256=x-_HDvx2wSs6_LCIUkiByffJjWlgFZsoOOiUIHhOhV0,3705
|
|
5
|
+
pyzbrowser/templates/index.html,sha256=i41u4tOrtFap23QshChHkJpJhySG_CqqtGAkqMUIOGE,33254
|
|
6
|
+
pyzbrowser-1.0.0.dist-info/METADATA,sha256=mRD19pHP9uQuCwWxMRv-SM9XWzwkiJq0OfFFnfJwU8E,9520
|
|
7
|
+
pyzbrowser-1.0.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
8
|
+
pyzbrowser-1.0.0.dist-info/entry_points.txt,sha256=iZNbjFo6NFQemfrbp6kV4CkqyfHxGawa0b0w5bqNDwo,56
|
|
9
|
+
pyzbrowser-1.0.0.dist-info/top_level.txt,sha256=C9dQtyTgfYojUcwk0pUo1SvjirXsBSE-mi98WHGRArE,11
|
|
10
|
+
pyzbrowser-1.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pyzbrowser
|