Skip to content

Commit

Permalink
refactor/ocp (#1)
Browse files Browse the repository at this point in the history
Co-authored-by: JarbasAi <[email protected]>
  • Loading branch information
NeonJarbas and JarbasAl authored Jan 8, 2024
1 parent dc547b2 commit 91fd590
Show file tree
Hide file tree
Showing 5 changed files with 8,299 additions and 8,308 deletions.
11 changes: 1 addition & 10 deletions LICENSE
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]
Copyright 2024 Casimiro Ferreira

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand All @@ -200,12 +200,3 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

=======================================================================

Component licenses for mycroft-core:

The mycroft-core software references various Python Packages (via PIP),
each of which has a separate license. All are compatible with the
Apache 2.0 license. See the referenced packages listed in the
"requirements/requirements.txt" file for specific terms and conditions.
133 changes: 67 additions & 66 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -1,64 +1,51 @@
from os.path import join, dirname
import random
from os.path import join, dirname

from ovos_plugin_common_play.ocp import MediaType, PlaybackType
from ovos_utils.log import LOG
from ovos_utils.parse import fuzzy_match
from ovos_workshop.skills.common_play import OVOSCommonPlaybackSkill, \
ocp_search, ocp_featured_media
from youtube_archivist import YoutubeMonitor
import requests
from json_database import JsonStorageXDG

from ovos_utils.ocp import MediaType, PlaybackType
from ovos_workshop.decorators.ocp import ocp_search, ocp_featured_media
from ovos_workshop.skills.common_play import OVOSCommonPlaybackSkill


class MaverickMoviesSkill(OVOSCommonPlaybackSkill):
def __init__(self):
super().__init__("MaverickMovies")
self.supported_media = [MediaType.MOVIE,
MediaType.GENERIC]
def __init__(self, *args, **kwargs):
self.supported_media = [MediaType.MOVIE]
self.skill_icon = self.default_bg = join(dirname(__file__), "ui", "maverickmovies_icon.jpg")
self.archive = YoutubeMonitor(db_name="MaverickMovies",
min_duration=30 * 60,
logger=LOG,
blacklisted_kwords=["trailer", "teaser", "movie scene",
"movie clip", "behind the scenes",
"Cult Clips", "Movie Preview",
"Fight Scene", "Documentary", "Episode",
"soundtrack", " OST", "opening theme"])
self.archive = JsonStorageXDG("MaverickMovies", subfolder="OCP")
super().__init__(*args, **kwargs)

def initialize(self):
self._sync_db()
self.load_ocp_keywords()

def load_ocp_keywords(self):
title = []
genre = ["urban movies", "black cinema"]

for url, data in self.archive.items():
t = data["title"].split("|")[0].split("(")[0].strip().split(",")[0].split("-")[0].lstrip("'").rstrip("'")
if '"' in t:
t = t.split('"')[1]
title.append(t.strip())

self.register_ocp_keyword(MediaType.MOVIE,
"movie_name", title)
self.register_ocp_keyword(MediaType.MOVIE,
"film_genre", genre)
self.register_ocp_keyword(MediaType.MOVIE,
"movie_streaming_provider",
["Maverick Movies",
"MaverickMovies"])

def _sync_db(self):
bootstrap = "https://github.com/JarbasSkills/skill-maverickmovies/raw/dev/bootstrap.json"
self.archive.bootstrap_from_url(bootstrap)
data = requests.get(bootstrap).json()
self.archive.merge(data)
self.schedule_event(self._sync_db, random.randint(3600, 24 * 3600))

def _sync_db(self):
url = "https://www.youtube.com/channel/UC2u3R3pjOiPZu4LtTlKkxdw"
self.archive.parse_videos(url)
self.schedule_event(self._sync_db, random.randint(3600, 24*3600))

# matching
def match_skill(self, phrase, media_type):
score = 0
if self.voc_match(phrase, "movie") or media_type == MediaType.MOVIE:
score += 10
if self.voc_match(phrase, "maverick"):
score += 50
return score

def normalize_title(self, title):
title = title.lower().strip()
title = self.remove_voc(title, "maverick")
title = self.remove_voc(title, "movie")
title = title.replace("|", "").replace('"', "") \
.replace(':', "").replace('”', "").replace('“', "") \
.strip()
return " ".join(
[w for w in title.split(" ") if w]) # remove extra spaces

def calc_score(self, phrase, match, base_score=0):
score = base_score
score += 100 * fuzzy_match(phrase.lower(), match["title"].lower())
return min(100, score)

def get_playlist(self, score=50, num_entries=250):
def get_playlist(self, score=50, num_entries=25):
pl = self.featured_media()[:num_entries]
return {
"match_confidence": score,
Expand All @@ -68,32 +55,41 @@ def get_playlist(self, score=50, num_entries=250):
"skill_icon": self.skill_icon,
"image": self.skill_icon,
"bg_image": self.default_bg,
"title": "Full Free Films (Movie Playlist)",
"author": "Full Free Films"
"title": "Maverick Movies (Movie Playlist)",
"author": "Maverick Movies"
}

@ocp_search()
def search_db(self, phrase, media_type):
base_score = self.match_skill(phrase, media_type)
if self.voc_match(phrase, "maverickmovies"):
yield self.get_playlist(base_score)
if media_type == MediaType.MOVIE:
# only search db if user explicitly requested movies
phrase = self.normalize_title(phrase)
for url, video in self.archive.db.items():
base_score = 15 if media_type == MediaType.MOVIE else 0
entities = self.ocp_voc_match(phrase)

title = entities.get("movie_name")
skill = "movie_streaming_provider" in entities # skill matched

base_score += 30 * len(entities)

if title:
base_score += 30
candidates = [video for video in self.archive.values()
if title.lower() in video["title"].lower()]
for video in candidates:
yield {
"title": video["title"],
"author": "Full Free Films",
"match_confidence": self.calc_score(phrase, video, base_score),
"author": video["author"],
"match_confidence": min(100, base_score),
"media_type": MediaType.MOVIE,
"uri": "youtube//" + url,
"uri": "youtube//" + video["url"],
"playback": PlaybackType.VIDEO,
"skill_icon": self.skill_icon,
"skill_id": self.skill_id,
"image": video["thumbnail"],
"bg_image": self.default_bg
"bg_image": video["thumbnail"]
}

if skill:
yield self.get_playlist()

@ocp_featured_media()
def featured_media(self):
return [{
Expand All @@ -106,8 +102,13 @@ def featured_media(self):
"skill_icon": self.skill_icon,
"bg_image": video["thumbnail"],
"skill_id": self.skill_id
} for video in self.archive.sorted_entries()]
} for video in self.archive.values()]


if __name__ == "__main__":
from ovos_utils.messagebus import FakeBus

def create_skill():
return MaverickMoviesSkill()
s = MaverickMoviesSkill(bus=FakeBus(), skill_id="t.fake")
for r in s.search_db("The Aftermath", MediaType.MOVIE):
print(r)
# {'title': 'The Aftermath | Full, Free Movie | Is The Risk Worth The Reward? | Action, Thriller [4K]', 'author': 'Maverick Movies', 'match_confidence': 75, 'media_type': <MediaType.MOVIE: 10>, 'uri': 'youtube//https://youtube.com/watch?v=XZ6h-hji1gE', 'playback': <PlaybackType.VIDEO: 1>, 'skill_icon': 'https://github.com/OpenVoiceOS/ovos-ocp-audio-plugin/raw/master/ovos_plugin_common_play/ocp/res/ui/images/ocp.png', 'skill_id': 't.fake', 'image': 'https://i.ytimg.com/vi/XZ6h-hji1gE/sddefault.jpg?v=638a585b', 'bg_image': 'https://i.ytimg.com/vi/XZ6h-hji1gE/sddefault.jpg?v=638a585b'}
Loading

0 comments on commit 91fd590

Please sign in to comment.