npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

upload-playlista

v1.1.0

Published

🎵 Biblioteca Node.js moderna para criação e gerenciamento de playlists de arquivos de mídia locais com CLI completa

Downloads

7

Readme

Upload Playlista 🎵

npm version License: MIT TypeScript Node.js Version

Uma biblioteca Node.js moderna e completa para criação e gerenciamento de playlists de arquivos de mídia locais com interface CLI robusta.

✨ Funcionalidades

  • 🎯 Geração automática de playlists a partir de diretórios locais
  • 📁 Suporte a múltiplos formatos de áudio e vídeo (.mp3, .wav, .mp4, .mkv, etc.)
  • 🎨 Capas personalizadas para playlists
  • 📊 Extração de metadados (título, artista, duração, etc.)
  • 💾 Exportação em múltiplos formatos (JSON, M3U, M3U8)
  • 🔄 Reordenação de itens da playlist
  • 🛡️ Type-safe com TypeScript
  • 🖥️ Interface de linha de comando (CLI)
  • Performance otimizada com busca recursiva

📦 Instalação

npm install upload-playlista

Instalação global (para usar a CLI)

npm install -g upload-playlista

🚀 Uso Rápido

Como biblioteca

import { createPlaylistManager, scanDirectory } from 'upload-playlista';

// Criar gerenciador de playlists
const manager = await createPlaylistManager();

// Criar uma nova playlist
const playlist = await manager.createPlaylist({
  name: 'Minha Playlist',
  description: 'Minhas músicas favoritas'
});

// Adicionar arquivos
await manager.addToPlaylist('Minha Playlist', '/caminho/para/musica.mp3');

// Definir capa
await manager.setPlaylistCover('Minha Playlist', '/caminho/para/capa.jpg');

// Exportar playlist
await manager.exportPlaylist('Minha Playlist', 'json', './playlist.json');

Via CLI

# Criar playlist
playlista create "Minha Playlist" -d "Minhas músicas favoritas"

# Adicionar arquivo
playlista add "Minha Playlist" "/caminho/para/musica.mp3"

# Listar playlists
playlista list

# Importar de diretório
playlista import "Rock Clássico" "/Music/Rock" -d "Coleção de rock clássico"

# Exportar playlist
playlista export "Minha Playlist" m3u "./playlist.m3u"

📖 API Completa

PlaylistManager

Construtor

import { PlaylistManager } from 'upload-playlista';

const manager = new PlaylistManager({
  storageDirectory: '/caminho/para/storage', // Diretório onde salvar playlists
  autoSave: true,                           // Salvar automaticamente
  compressionEnabled: false                 // Compressão de arquivos
});

await manager.initialize();

Métodos principais

// Criar playlist
const playlist = await manager.createPlaylist({
  name: 'Nome da Playlist',
  description: 'Descrição opcional',
  coverImage: '/caminho/para/capa.jpg' // opcional
});

// Adicionar arquivo
await manager.addToPlaylist('Nome da Playlist', '/caminho/arquivo.mp3');

// Remover arquivo
await manager.removeFromPlaylist('Nome da Playlist', '/caminho/arquivo.mp3');

// Reordenar itens
await manager.reorderPlaylist('Nome da Playlist', 0, 2); // mover item do índice 0 para 2

// Definir capa
await manager.setPlaylistCover('Nome da Playlist', '/caminho/capa.jpg');

// Obter playlist
const playlist = manager.getPlaylist('Nome da Playlist');

// Listar todas
const names = manager.listPlaylists();
const playlists = manager.getAllPlaylists();

// Excluir playlist
await manager.deletePlaylist('Nome da Playlist');

// Exportar
await manager.exportPlaylist('Nome da Playlist', 'json', './output.json');
await manager.exportPlaylist('Nome da Playlist', 'm3u', './output.m3u');

// Importar de diretório
const playlist = await manager.importFromDirectory(
  'Nova Playlist',
  '/caminho/diretorio',
  'Descrição opcional'
);

// 🆕 NOVOS MÉTODOS: Obter tracks como arrays
const allTracks = manager.getPlaylistTracks('Nome da Playlist');
const audioTracks = manager.getPlaylistAudioTracks('Nome da Playlist');
const videoTracks = manager.getPlaylistVideoTracks('Nome da Playlist');
const simplifiedTracks = manager.getPlaylistTracksSimplified('Nome da Playlist');

FileScanner

import { FileScanner } from 'upload-playlista';

// Escanear diretório
const mediaFiles = await FileScanner.scanDirectory('/caminho/diretorio', {
  recursive: true,        // Busca recursiva
  includeHidden: false,   // Incluir arquivos ocultos
  maxDepth: 10,          // Profundidade máxima
  includeFormats: ['.mp3', '.mp4'] // Formatos específicos
});

// Extrair metadados de arquivo único
const metadata = await FileScanner.extractMetadata('/arquivo.mp3');

// Verificar se formato é suportado
const isSupported = FileScanner.isSupportedFormat('.mp3');

// Obter formatos suportados
const formats = FileScanner.getSupportedFormats();

Funções de conveniência

import {
  createPlaylist,
  addToPlaylist,
  removeFromPlaylist,
  deletePlaylist,
  listPlaylists,
  getPlaylist,
  setPlaylistCover,
  scanDirectory,
  // 🆕 Novas funções para obter tracks
  getPlaylistTracks,
  getPlaylistAudioTracks,
  getPlaylistVideoTracks,
  getPlaylistTracksSimplified
} from 'upload-playlista';

// Todas as funções aceitam um parâmetro opcional storageDirectory
const playlist = await createPlaylist('Nome', 'Descrição', '/capa.jpg', '/storage');

// 🆕 Obter tracks diretamente
const tracks = await getPlaylistTracks('Minha Playlist');
const audioOnly = await getPlaylistAudioTracks('Minha Playlist');
const simplified = await getPlaylistTracksSimplified('Minha Playlist');

// Exemplo de uso dos tracks
tracks.forEach((track, index) => {
  console.log(`${index + 1}. ${track.title || track.fileName}`);
  console.log(`   Artista: ${track.artist || 'Desconhecido'}`);
  console.log(`   Duração: ${Math.floor((track.duration || 0) / 60)}min`);
});

🎯 Formatos Suportados

Áudio

  • .mp3, .wav, .flac, .aac, .ogg, .m4a, .wma

Vídeo

  • .mp4, .mkv, .avi, .mov, .wmv, .flv, .webm

Imagens (capas)

  • .jpg, .jpeg, .png, .bmp, .gif, .webp

📁 Estrutura da Playlist

interface Playlist {
  id: string;
  name: string;
  description?: string;
  coverImage?: string;
  items: PlaylistItem[];
  createdAt: Date;
  updatedAt: Date;
  totalDuration: number;
  totalFiles: number;
}

interface PlaylistItem {
  id: string;
  metadata: MediaMetadata;
  order: number;
}

interface MediaMetadata {
  fileName: string;
  filePath: string;
  fileSize: number;
  duration?: number;
  title?: string;
  artist?: string;
  album?: string;
  year?: number;
  genre?: string;
  format: string;
  bitrate?: number;
  sampleRate?: number;
  dateAdded: Date;
}

// 🆕 NOVO: Interface simplificada para tracks
interface TrackInfo {
  title: string;      // Título ou nome do arquivo
  artist: string;     // Artista ou "Artista Desconhecido"
  album: string;      // Álbum ou "Álbum Desconhecido"
  filePath: string;   // Caminho completo
  duration: number;   // Duração em segundos (0 se N/A)
  format: string;     // Extensão (.mp3, .wav, etc.)
}

🖥️ CLI - Comandos Disponíveis

# Criar playlist
playlista create <nome> [opções]
  -d, --description <desc>  Descrição da playlist
  -c, --cover <path>        Caminho para imagem de capa
  -s, --storage <path>      Diretório de armazenamento

# Adicionar arquivo
playlista add <playlist> <arquivo> [opções]

# Remover arquivo
playlista remove <playlist> <arquivo> [opções]

# Listar playlists
playlista list [opções]
  -v, --verbose            Exibir informações detalhadas

# Exibir playlist
playlista show <playlist> [opções]

# Excluir playlist
playlista delete <playlist> [opções]
  -y, --yes               Confirmar automaticamente

# Definir capa
playlista cover <playlist> <imagem> [opções]

# Exportar playlist
playlista export <playlist> <formato> <arquivo> [opções]

# Escanear diretório
playlista scan <diretório> [opções]
  -r, --recursive         Busca recursiva
  -h, --hidden           Incluir arquivos ocultos
  -d, --depth <número>   Profundidade máxima
  -f, --formats <lista>  Formatos específicos

# Importar de diretório
playlista import <nome> <diretório> [opções]
  -d, --description <desc>  Descrição da playlist
  -r, --recursive          Busca recursiva

🛠️ Desenvolvimento

# Instalar dependências
npm install

# Compilar TypeScript
npm run build

# Executar em modo desenvolvimento
npm run dev

# Executar testes
npm test

# Lint
npm run lint

# CLI em desenvolvimento
npm run cli -- create "Test Playlist"

📝 Exemplo Completo

import { createPlaylistManager } from 'upload-playlista';

async function exemplo() {
  // Criar gerenciador
  const manager = await createPlaylistManager('./minhas-playlists');
  
  // Criar playlist
  const playlist = await manager.createPlaylist({
    name: 'Músicas para Trabalhar',
    description: 'Playlist para concentração'
  });
  
  // Escanear diretório e adicionar arquivos
  const playlist2 = await manager.importFromDirectory(
    'Biblioteca Musical',
    '/Users/usuario/Music'
  );
  
  // Definir capa
  await manager.setPlaylistCover(
    'Músicas para Trabalhar',
    '/Users/usuario/Pictures/work-cover.jpg'
  );
  
  // Reordenar itens
  await manager.reorderPlaylist('Biblioteca Musical', 0, 5);
  
  // Exportar em diferentes formatos
  await manager.exportPlaylist('Biblioteca Musical', 'json', './biblioteca.json');
  await manager.exportPlaylist('Biblioteca Musical', 'm3u8', './biblioteca.m3u8');
  
  // Listar todas as playlists
  const playlists = manager.getAllPlaylists();
  console.log(`Total de playlists: ${playlists.length}`);
  
  playlists.forEach(p => {
    console.log(`- ${p.name}: ${p.totalFiles} arquivos, ${Math.floor(p.totalDuration/60)} minutos`);
  });
}

exemplo().catch(console.error);

🔧 Configuração Avançada

Opções do Scanner

const options = {
  recursive: true,              // Busca recursiva nos subdiretórios
  includeHidden: false,         // Incluir arquivos/pastas ocultos
  maxDepth: 10,                // Profundidade máxima da busca
  includeFormats: ['.mp3', '.wav'] // Filtrar apenas formatos específicos
};

const files = await FileScanner.scanDirectory('/music', options);

Configuração do Manager

const manager = new PlaylistManager({
  storageDirectory: './playlists',  // Onde salvar as playlists
  autoSave: true,                  // Salvar automaticamente após mudanças
  compressionEnabled: false        // Comprimir arquivos JSON (futuro)
});

🚀 Roadmap

  • [ ] Suporte a streaming de URLs
  • [ ] Sincronização com serviços de música
  • [ ] Interface web
  • [ ] Plugins customizados
  • [ ] Cache de metadados
  • [ ] Suporte a bibliotecas remotas

🤝 Contribuindo

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/nova-feature)
  3. Commit suas mudanças (git commit -am 'Adiciona nova feature')
  4. Push para a branch (git push origin feature/nova-feature)
  5. Abra um Pull Request

📄 Licença

MIT License - veja o arquivo LICENSE para detalhes.

👥 Suporte


Feito com ❤️ em TypeScript