diff options
| -rw-r--r-- | SmallYTChannelBotSubmissions.py | 48 | ||||
| -rw-r--r-- | onceaday.py | 2 | ||||
| -rw-r--r-- | test_ytapi.py | 69 | ||||
| -rw-r--r-- | ytapi.py | 90 | 
4 files changed, 208 insertions, 1 deletions
| diff --git a/SmallYTChannelBotSubmissions.py b/SmallYTChannelBotSubmissions.py index 712f5b0..aa3943d 100644 --- a/SmallYTChannelBotSubmissions.py +++ b/SmallYTChannelBotSubmissions.py @@ -248,6 +248,54 @@ def main():                                  will be rewarded 1λ if you do so.  For more information, read the [FAQ](https://www.reddit.com/user/SmallYTChannelBot/comments/a4u7qj/smallytchannelbot_faq/)""" % (score - 3, str(submission.author))                                  db.change_lambda(str(submission.author), -3) +                                ytid = ytapi.get_videoId_from_url(submission.url) +                                if "/" not in ytid: +                                    ytdata = ytapi.get_video_data(ytid) + +                                    text += """ +\n\n\n##Video data: + +Field|Data +:-|:- +Title|%s +Thumbnail|[Link](%s) +Views|%s +Length|%s +Likes/Dislikes|%s/%s +Comments|%s +Description|%s + +##Channel Data: + +Field|Data +:-|:- +Name|%s +Thumbnail|[Link](%s) +Subscribers|%s +Videos|%s +Views|%s +                                    """ % ( +                                        ytdata["title"], +                                        ytdata["thumbnail"], +                                        ytdata["views"], +                                        ytdata["length"], +                                        ytdata["likes"], +                                        ytdata["dislikes"], +                                        ytdata["comments"], +                                        ytdata["description"], +                                        ytdata["channel"], +                                        ytdata["channelThumb"], +                                        ytdata["subscribers"], +                                        ytdata["videos"], +                                        ytdata["channelViews"] +                                    ) + +                                    curflair = submission.link_flair_text +                                    if str(curflair) != "None": +                                        submission.mod.flair(" %s | %s | :youtube: %s" % (curflair, ytdata["length"], ytdata["channel"])) +                                    else:     +                                        submission.mod.flair("%s | :youtube: %s" % (ytdata["length"], ytdata["channel"])) +                          update_users_flair(submission)                          reply = submission.reply(text + tail)                          reply.mod.distinguish(sticky = True) diff --git a/onceaday.py b/onceaday.py index a84b0d9..5bebc54 100644 --- a/onceaday.py +++ b/onceaday.py @@ -5,5 +5,5 @@ SECONDS_IN_DAY = 25 * 60 * 60  while True:      SmallYTChannelBotSubmissions.every_day() -    print("Called @ %s" % SmallYTChannelBotSubmissions.get_time) +    print("Called @ %s" % SmallYTChannelBotSubmissions.get_time())      sleep(SECONDS_IN_DAY) diff --git a/test_ytapi.py b/test_ytapi.py new file mode 100644 index 0000000..44f439f --- /dev/null +++ b/test_ytapi.py @@ -0,0 +1,69 @@ +import praw +import database +import login +import ytapi + +reddit = login.REDDIT + +subreddit = reddit.subreddit("jwnskanzkwktest") + +tail = "\n\n\n ^/u/SmallYTChannelBot ^*made* ^*by* ^/u/jwnskanzkwk. ^*PM* ^*for* ^*bug* ^*reports.* ^*For* ^*more* ^*information,* ^*read* ^*the* ^[FAQ.](https://www.reddit.com/user/SmallYTChannelBot/comments/a4u7qj/smallytchannelbot_faq/)" + +submission_stream = subreddit.stream.submissions(pause_after=-1) +while True: + +    for submission in submission_stream: +        if submission is not None: + +            text = "Thank you for submitting..." +            ytid = ytapi.get_videoId_from_url(submission.url) +            if "/" not in ytid: +                ytdata = ytapi.get_video_data(ytid) + +                text += """ +\n\n\n##Video data: + +Field|Data +:-|:- +Title|%s +Thumbnail|[Link](%s) +Views|%s +Length|%s +Likes/Dislikes|%s/%s +Comments|%s +Description|%s + +##Channel Data: + +Field|Data +:-|:- +Name|%s +Thumbnail|[Link](%s) +Subscribers|%s +Videos|%s +Views|%s + +                """ % ( +                    ytdata["title"], +                    ytdata["thumbnail"], +                    ytdata["views"], +                    ytdata["length"], +                    ytdata["likes"], +                    ytdata["dislikes"], +                    ytdata["comments"], +                    ytdata["description"], +                    ytdata["channel"], +                    ytdata["channelThumb"], +                    ytdata["subscribers"], +                    ytdata["videos"], +                    ytdata["channelViews"] +                ) + +                curflair = submission.link_flair_text +                if str(curflair) != "None": +                    submission.mod.flair(" %s | %s | :youtube: %s" % (curflair, ytdata["length"], ytdata["channel"])) +                else:     +                    submission.mod.flair("%s | :youtube: %s" % (ytdata["length"], ytdata["channel"])) + +                reply = submission.reply(text + tail) +                reply.mod.distinguish(sticky = True) diff --git a/ytapi.py b/ytapi.py new file mode 100644 index 0000000..b472b7e --- /dev/null +++ b/ytapi.py @@ -0,0 +1,90 @@ +from googleapiclient.discovery import build +from googleapiclient.errors import HttpError +import js2py + +ERROR_DICT =  { +        "title": "ERROR Video deleted?", +        "description": "ERROR Video deleted?", +        "channel": "ERROR Video deleted?", +        "subscribers": "ERROR Video deleted?", +        "videos": "ERROR Video deleted?", +        "channelViews": "ERROR Video deleted?", +        "channelThumb": "ERROR Video deleted?", +        "thumbnail": "ERROR Video deleted?", +        "length": "ERROR Video deleted?", +        "views": "ERROR Video deleted?", +        "likes": "ERROR Video deleted?", +        "dislikes": "ERROR Video deleted?", +        "comments": "ERROR Video deleted?" +    } + +# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps +# tab of +#   https://cloud.google.com/console +# Please ensure that you have enabled the YouTube Data API for your project. +DEVELOPER_KEY = 'AIzaSyBQsuU5GgCTZdFi7cBmPQHWZwIa545zLUE' +YOUTUBE_API_SERVICE_NAME = 'youtube' +YOUTUBE_API_VERSION = 'v3' + +#run JavaScript because I don't understand regular expressions so we can copy this bad boy from Stack Overflow +get_videoId_from_url = js2py.eval_js(r"""function $(url){ +                            var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*?[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig; +                            return url.replace(re, '$1'); +                        }""") + +def _yt_time_to_norm(time): +    if time == "ERROR Video deleted?": +        return time + +    time = time.replace("M", ":")[2:].replace("S", "") + +    s = time.split(":") +    if len(s) > 1: +        if len(s[1]) < 2: +            time = s[0] + ":" + s[1] + "0" + +    return time + +#this would be better as a class but I can't be bothered so dictionary it is +def get_video_data(videoId): +    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY) + + +    #youTubeData = youtube.videos().list(part = "snippet", id = videoId).execute()["items"][0]["snippet"] + +    #return {"title": youTubeData["title"], "description": youTubeData["description"], "tags": youTubeData["tags"]} + +    try: +        youTubeData = youtube.videos().list(part = "snippet,contentDetails,statistics", id = videoId).execute()["items"][0] +    except IndexError: +        return ERROR_DICT + +    snippet = youTubeData["snippet"] +    length = youTubeData["contentDetails"]["duration"] +    stats = youTubeData["statistics"] +    channelId = snippet["channelId"] + +    channelData = youtube.channels().list(part = 'snippet,statistics', id = channelId).execute()["items"][0] + +    return { +        "title": snippet["title"], +        "description": snippet["description"].replace("\n", "⤶"), +        "channel": channelData["snippet"]["title"], +        "subscribers": channelData["statistics"]["subscriberCount"], +        "videos": channelData["statistics"]["videoCount"], +        "channelViews": channelData["statistics"]["viewCount"], +        "channelThumb": channelData["snippet"]["thumbnails"]["high"]["url"], +        "thumbnail": snippet["thumbnails"]["high"]["url"], +        "length": _yt_time_to_norm(length), +        "views": stats["viewCount"], +        "likes": stats["likeCount"], +        "dislikes": stats["dislikeCount"], +        "comments": stats["commentCount"] +    } + + +if __name__ == '__main__': +    try: +        print(get_channel_data("https://www.youtube.com/watch?v=XPpAkggrdaU&feature=youtu.be")) +    except HttpError as e: +        print('An HTTP error %d occurred:\n%s' % (e.resp.status, e.content))
\ No newline at end of file | 
