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/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
+ [![Python Version](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/)
29
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
30
+ [![Flask](https://img.shields.io/badge/flask-3.0.3-red.svg)](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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ pyzbrowser = pyzbrowser.__main__:main
@@ -0,0 +1 @@
1
+ pyzbrowser