From f1ddf104809017784aa136ebb8ff7e2cfb96d5f4 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Sun, 11 Oct 2015 00:15:23 +0200 Subject: Changed directory structure to use pyscaffold --- youtube_podcaster/youtube/__init__.py | 6 +++++ youtube_podcaster/youtube/downloader.py | 42 +++++++++++++++++++++++++++++++ youtube_podcaster/youtube/youtube.py | 44 +++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 youtube_podcaster/youtube/__init__.py create mode 100644 youtube_podcaster/youtube/downloader.py create mode 100644 youtube_podcaster/youtube/youtube.py (limited to 'youtube_podcaster/youtube') diff --git a/youtube_podcaster/youtube/__init__.py b/youtube_podcaster/youtube/__init__.py new file mode 100644 index 0000000..d26ae61 --- /dev/null +++ b/youtube_podcaster/youtube/__init__.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +from youtube.youtube import Youtube +from youtube.downloader import Downloader + +# vim: set ts=8 sw=4 tw=0 et : diff --git a/youtube_podcaster/youtube/downloader.py b/youtube_podcaster/youtube/downloader.py new file mode 100644 index 0000000..ca1327b --- /dev/null +++ b/youtube_podcaster/youtube/downloader.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import youtube_dl +import os + + +class Downloader: + instance = None + + def get_instance(file_format, location, base_url): + if Downloader.instance: + return Downloader.instance + else: + Downloader.instance = Downloader(file_format, location, base_url) + return Downloader.instance + + def __init__(self, file_format, location, base_url): + self.file_format = file_format + self.location = location + self.base_url = base_url + + def download(self, video, video_id, feed_id): + output = "%s/%s/%s.ogg" % (self.location, feed_id, video_id) + options = {"format": "bestaudio/best", + "outtmpl": output, + "postprocessors": [{ + "key": "FFmpegExtractAudio", + "preferredcodec": self.file_format + }], + "nooverwrites": True + } + + video_url = "https://www.youtube.com/watch?v=%s" % (video["snippet"]["resourceId"]["videoId"]) + youtube_dl.YoutubeDL(options).download([video_url]) + + url = "%s/%s/%s.ogg" % (self.base_url, feed_id, video_id) + size = str(os.path.getsize(output)) + mime = "audio/ogg" + + return (url, size, mime) + +# vim: set ts=8 sw=4 tw=0 et : diff --git a/youtube_podcaster/youtube/youtube.py b/youtube_podcaster/youtube/youtube.py new file mode 100644 index 0000000..bcbff21 --- /dev/null +++ b/youtube_podcaster/youtube/youtube.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 + +from urllib import parse, request +import json + + +class Youtube: + + def __init__(self, api_key): + self.api_key = api_key + + def _api_call(self, section, parameters): + parameters["key"] = self.api_key + data = parse.urlencode(parameters) + api_base = "https://www.googleapis.com/youtube/v3" + response = request.urlopen("%s/%s?%s" % (api_base, section, data)) + return json.loads(response.read().decode("UTF-8"))["items"] + + def search(self, query): + return self._api_call("search", {"part": "snippet", + "q": query}) + + def get_channel(self, username): + return self._api_call("channels", {"part": "snippet", + "forUsername": username}) + + def get_uploads(self, channel): + content_details = self._api_call("channels", {"part": "contentDetails", + "id": channel["id"]}) + uploads_id = content_details[0]["contentDetails"]["relatedPlaylists"]["uploads"] + return self._api_call("playlists", {"part": "snippet", + "id": uploads_id}) + + def get_playlists(self, channel, max_results=5): + return self._api_call("playlists", {"part": "snippet", + "channelId": channel["id"], + "maxResults": max_results}) + + def get_playlist_items(self, playlist, max_results=5): + return self._api_call("playlistItems", {"part": "snippet", + "playlistId": playlist["id"], + "maxResults": max_results}) + +# vim: set ts=8 sw=4 tw=0 et : -- cgit v1.2.3