Introdução breve: quero falar sobre o player online do YouTube para Android com playlists locais, canais e recomendações.

Introdução detalhada:
Algum tempo atrás, enfrentei exatamente o mesmo problema que o autor deste maravilhoso aplicativo , e cheguei à mesma conclusão: quero poder dar ao meu filho um tablet ou smartphone com desenhos animados de vez em quando, mas não estou nada satisfeito com o que aparece após 2-3 cliques na lista de recomendações nos aplicativos padrão do cliente YouTube.
Infelizmente, após instalar o aplicativo Channel Whitelist, notei que ele tinha outra desvantagem mais prosaica, mas ainda assim fatal — o NIH não me pareceu (e, principalmente, ao meu filho) muito confortável de usar, especialmente depois de me acostumar com o player YouTube Kids.
Em suma, depois de algum tempo, decidi criar minha própria implementação. Após mais algum tempo, foi possível adicionar a tag para o primeiro lançamento.
Principais funcionalidades:
- Adicione seus canais e playlists favoritos — eles serão salvos e indexados na base de dados local.
- Dentro das playlists adicionadas, desative os vídeos desnecessários, caso não precise deles.
- A lista de recomendações é gerada aleatoriamente apenas a partir dos canais e playlists adicionados ao aplicativo.
O código-fonte é aberto, licença GPLv3:
A seguir, uma visão geral das principais funcionalidades em mais detalhes, além de algumas informações técnicas sobre como reproduzir vídeos do YouTube em seu aplicativo Android sem usar a API do Google e wrappers da web.
Na tela inicial e na tela do player: recomendações aleatórias de canais não aleatórios.
Busca instantânea na base de dados local.
=>
Adicionar novo canal ou playlist.
Buscar por nome online ou inserir um endereço conhecido. A lista de vídeos do canal ou da playlist é salva na base de dados local, ícones não são armazenados em cache.
Playlist dinâmica — reproduzir resultados da pesquisa.
=>
Nas recomendações abaixo do vídeo, haverá apenas vídeos que atendem à busca realizada.
De maneira semelhante, se você abrir um vídeo a partir das configurações da playlist, na lista de recomendações só aparecerão vídeos dessa mesma playlist.
Playlists e canais podem ser desativados temporariamente e ativados novamente.
Observe: videos from the disabled playlist will also disappear from search results, viewing history, and favorites. But don't worry, they will reappear there as soon as the playlist is enabled again.
Adicionar vídeo à lista negra
O vídeo bloqueado não aparecerá nas recomendações, nos resultados de pesquisa, desaparecerá da lista de favoritos e do histórico de visualizações. O vídeo ainda será visível nas configurações da playlist.
Visualizar lista negra e reativar itens que foram bloqueados por engano:
Configurações > menu no cabeçalho > Lista negra
Vídeos favoritos e histórico de visualizações
Os vídeos favoritos na tela do player são marcados com uma estrela no canto superior direito.
Menus contextuais no cabeçalho da tela e com um clique longo nas galerias e listas
Copiar o nome ou o endereço do vídeo ou da playlist na tela de visualização ou em qualquer lista.
Início rápido — adicionar canais e playlists recomendados
=>
O aplicativo imediatamente terá a aparência das capturas de tela acima.
Canais e playlists indesejados podem ser desativados ou removidos nas configurações.
Instalação
Página do projeto:
em inglês:
lançamentos:
- No Google Play não há e, pelo visto, não haverá (o Google banem aplicativos que contornam a API raspando seu site, incluindo o mencionado Channel Whitelist ou o player NewPipe)
- Colete a partir das fontes:
- Baixe o apk da seção de lançamentos:
- Espero que apareça no diretório em algum tempo (, mas não avança há quase um mês), mas até agora não há
Tenha em mente que não será possível alternar entre diferentes versões de diferentes fontes em um mesmo dispositivo devido a diferentes assinaturas do arquivo apk, antes de instalar a versão de uma nova fonte, você terá que remover a versão instalada junto com os dados — cache de playlists e histórico de visualizações (ou encontrar uma forma de transferir esses dados).
Detalhes técnicos
Não requer conta do Google/YouTube, apenas precisa de internet, utiliza as bibliotecas:
- para obter dados do serviço YouTube e
- para reprodução de vídeos.
Código aberto, licença livre GPLv3.
pergunta: É legal raspar sites sem permissão (ou com proibição explícita) dos autores? , que não utilizam sua API, mas raspam seus sites, pois violam seu termo de uso.
Resposta: claro, é legal, você pode escolher qual ferramenta usar para ler informações públicas. Mais ainda: , mas o Gula pode ter uma opinião diferente, pessoalmente ainda não tenho vontade de ir a um tribunal americano para convencê-los.
Um pouco de código
A biblioteca — um projeto auxiliar do reprodutor , permite baixar uma lista de vídeos para um canal ou playlist específicos, obter informações detalhadas sobre um vídeo conhecido (o que é visível na página da web do vídeo), obter o endereço do ícone do vídeo e também acessar o endereço do fluxo de vídeo.
O código para baixar a playlist é um pouco extenso, então não vou incluí-lo aqui, quem tiver interesse — dê uma olhada nos arquivos de origem, principalmente é a classe .
Vamos ver como obter o endereço do fluxo de vídeo a partir do endereço da página pública do vídeo e reproduzi-lo no reprodutor.
Conecte a biblioteca em
dependencies {
...
// NewPipe: parser do youtube
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Curiosamente, mesmo após isso, ainda não será possível utilizá-la, pois os exemplos vão acusar a ausência da classe Downloader. Você pode copiá-la para o projeto do diretório de testes automáticos — funciona para a versão 0.17.4 (parece que em uma versão mais nova da biblioteca essa parte foi reestruturada, mas isso ainda precisa ser verificado).
Obtenha o endereço do fluxo de vídeo a partir do endereço da página do vídeo no site do YouTube:
public String extractYtStreamUrl(final String ytVidUrl) throws ExtractionException, IOException {
// https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java
NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
final YoutubeStreamExtractor extractor = (YoutubeStreamExtractor) YouTube
.getStreamExtractor(ytVidUrl);
extractor.fetchPage();
final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null;
// for (final VideoStream stream : extractor.getVideoStreams()) {
// stream.getUrl();
// }
return streamUrl;
}Como endereço do vídeo, ytVidUrl pode ser o endereço público da página de qualquer vídeo no site do YouTube, por exemplo
O reprodutor estará da própria Google. Não é uma interface web sobre o YouTube, mas sim um verdadeiro player embutido para reproduzir qualquer vídeo, suficientemente flexível e personalizável. Ele também consegue reproduzir fluxos de vídeo do YouTube, se for fornecido o endereço correto. Acabamos de obter o endereço do fluxo, então vamos ver como enviá-lo para o player.
Adicionar a biblioteca ao projeto :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Não vamos considerar todos os detalhes sobre o posicionamento do componente player na tela do aplicativo (você pode verificar os exemplos no site do projeto ou no código), vamos nos concentrar apenas em como iniciar a reprodução de vídeos do YouTube no player com o endereço obtido acima:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// parar a reprodução do vídeo atual, se foi carregado
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(streamUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// Pause o vídeo antigo enquanto preparamos o novo
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Se pausar aqui depois que o player já pausou por conta própria, terminando
// de reproduzir o vídeo, receberemos aqui um segundo evento STATE_ENDED, então precisamos de uma verificação
// especial aqui.
// O valor de getPlayWhenReady() permanecerá true, então checamos exatamente o estado.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Prepare o player com a fonte.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Indique a posição atual imediatamente ao carregar o vídeo
// (nos comentários algo é mencionado sobre fontes de dados que suportam ou não suportam
// transições seek ao carregar, mas parece que isso é balela - basta fazer seek imediatamente após o carregamento)
// Exoplayer toca nova Playlist do começo em vez da posição fornecida
// https://github.com/google/ExoPlayer/issues/4375
// Como carregar o stream na posição desejada? #2197
// https://github.com/google/ExoPlayer/issues/2197
// neste ponto a duração normal ainda não está disponível, então não a checamos
//if(seekTo > 0 && seekTo 0) {
// 5 segundos antes
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Problemas conhecidos
- Não irá reproduzir vídeos com restrições de idade que exigem login na conta Google/YouTube.
por exemplo: ,
dica: adicione esses vídeos à lista negra ou peça ao autor do vídeo para remover a restrição, que foi aplicada por engano.
- Não irá reproduzir alguns vídeos de transmissão, para os quais o serviço retorna comprimento nulo (para esses vídeos, a duração nas listas e na galeria é marcada como "[dur undef]")
por exemplo: ,
dica: adicione esses vídeos à lista negra.
- Vídeos disponíveis apenas por links diretos podem não aparecer na playlist local, mesmo que você carregue todos os vídeos do usuário.
por exemplo:
Se você encontrar um vídeo público que não requer login, reproduz em navegador, mas não no player, envie um relatório de bug (é bem possível que o problema já tenha sido corrigido em uma nova versão NewPipeExtractor e será necessário apenas atualizar para essa versão. ).
A interface pode ter um atraso em conexões lentas (mas não desconectadas).
Como resultado,
O filho mudou do tablet para uma smart TV Samsung, que não consegue rodar aplicativos Android. Portanto, o melhor controle parental ainda é o acompanhamento pessoal.
Mas o aplicativo se mostrou suficientemente conveniente para que eu começasse a usá-lo. A primeira impressão das versões iniciais foi a de estar em um mundo diferente. Todo o conteúdo é carregado do YouTube, mas isso já não é YouTube, é algo diferente, seguro e controlado, como se eu tivesse tirado uma escolopendra do olho e colocado em um frasco de vidro. E a questão são as recomendações.
Fonte: habr.com
