def get_child(self, item_id, e_item): ''' Get all child elements from tv show jellyfin id. ''' obj = {'Id': item_id} child = [] try: obj['KodiId'] = e_item[0] obj['FileId'] = e_item[1] obj['ParentId'] = e_item[3] obj['Media'] = e_item[4] except TypeError: return child obj['ParentId'] = obj['KodiId'] for season in self.jellyfin_db.get_item_by_parent_id( *values(obj, QUEM.get_item_by_parent_season_obj)): temp_obj = dict(obj) temp_obj['ParentId'] = season[1] child.append(season[0]) for episode in self.jellyfin_db.get_item_by_parent_id( *values(temp_obj, QUEM.get_item_by_parent_episode_obj)): child.append(episode[0]) for episode in self.jellyfin_db.get_media_by_parent_id(obj['Id']): child.append(episode[0]) return child
def get_child(self, item_id, e_item): ''' Get all child elements from tv show jellyfin id. ''' obj = {'Id': item_id} child = [] try: obj['KodiId'] = e_item[0] obj['FileId'] = e_item[1] obj['ParentId'] = e_item[3] obj['Media'] = e_item[4] except TypeError: return child obj['ParentId'] = obj['KodiId'] for album in self.jellyfin_db.get_item_by_parent_id( *values(obj, QUEM.get_item_by_parent_album_obj)): temp_obj = dict(obj) temp_obj['ParentId'] = album[1] child.append((album[0], )) for song in self.jellyfin_db.get_item_by_parent_id( *values(temp_obj, QUEM.get_item_by_parent_song_obj)): child.append((song[0], )) return child
def season(self, item, show_id=None): ''' If item does not exist, entry will be added. If item exists, entry will be updated. If the show is empty, try to remove it. ''' server_address = self.server.auth.get_server_info( self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Season') obj['ShowId'] = show_id if obj['ShowId'] is None: try: obj['ShowId'] = self.jellyfin_db.get_item_by_id( *values(obj, QUEM.get_item_series_obj))[0] except (KeyError, TypeError): LOG.error("Unable to add series %s", obj['SeriesId']) return False obj['SeasonId'] = self.get_season(*values(obj, QU.get_season_obj)) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) if obj['Location'] != "Virtual": self.jellyfin_db.add_reference( *values(obj, QUEM.add_reference_season_obj)) self.item_ids.append(obj['Id']) self.artwork.add(obj['Artwork'], obj['SeasonId'], "season") LOG.info("UPDATE season [%s/%s] %s: %s", obj['ShowId'], obj['SeasonId'], obj['Title'] or obj['Index'], obj['Id'])
def song_artist_link(self, obj): ''' Assign main artists to song. Artist does not exist in jellyfin database, create the reference. ''' for index, artist in enumerate(obj['ArtistItems'] or []): temp_obj = dict(obj) temp_obj['Name'] = artist['Name'] temp_obj['Id'] = artist['Id'] temp_obj['Index'] = index try: temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id( *values(temp_obj, QUEM.get_item_obj))[0] except TypeError: try: self.artist(self.server.jellyfin.get_item(temp_obj['Id']), library=None) temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id( *values(temp_obj, QUEM.get_item_obj))[0] except Exception as error: LOG.exception(error) continue self.link_song_artist(*values(temp_obj, QU.update_song_artist_obj)) self.item_ids.append(temp_obj['Id'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' server_address = self.server.auth.get_server_info( self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'SongUserData') try: obj['KodiId'] = e_item[0] obj['Media'] = e_item[4] except TypeError: return obj['Rating'] = 0 if obj['Media'] == 'song': if obj['DatePlayed']: obj['DatePlayed'] = Local( obj['DatePlayed']).split('.')[0].replace('T', " ") self.rate_song(*values(obj, QU.update_song_rating_obj)) self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.debug("USERDATA %s [%s] %s: %s", obj['Media'], obj['KodiId'], obj['Id'], obj['Title'])
def song_add(self, obj): ''' Add object to kodi. Verify if there's an album associated. If no album found, create a single's album ''' obj['PathId'] = self.add_path(obj['Path']) try: obj['AlbumId'] = self.jellyfin_db.get_item_by_id( *values(obj, QUEM.get_item_song_obj))[0] except TypeError: try: if obj['SongAlbumId'] is None: raise TypeError("No album id found associated?") self.album(self.server.jellyfin.get_item(obj['SongAlbumId'])) obj['AlbumId'] = self.jellyfin_db.get_item_by_id( *values(obj, QUEM.get_item_song_obj))[0] except TypeError: self.single(obj) self.add_song(*values(obj, QU.add_song_obj)) self.jellyfin_db.add_reference( *values(obj, QUEM.add_reference_song_obj)) LOG.debug("ADD song [%s/%s/%s] %s: %s", obj['PathId'], obj['AlbumId'], obj['SongId'], obj['Id'], obj['Title'])
def artist_link(self, obj): ''' Assign main artists to album. Artist does not exist in jellyfin database, create the reference. ''' for artist in (obj['AlbumArtists'] or []): temp_obj = dict(obj) temp_obj['Name'] = artist['Name'] temp_obj['Id'] = artist['Id'] try: temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id( *values(temp_obj, QUEM.get_item_obj))[0] except TypeError: try: self.artist(self.server.jellyfin.get_item(temp_obj['Id']), library=None) temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id( *values(temp_obj, QUEM.get_item_obj))[0] except Exception as error: LOG.exception(error) continue self.update_artist_name( *values(temp_obj, QU.update_artist_name_obj)) self.link(*values(temp_obj, QU.update_link_obj)) self.item_ids.append(temp_obj['Id'])
def season(self, item, show_id=None, *args, **kwargs): ''' If item does not exist, entry will be added. If item exists, entry will be updated. If the show is empty, try to remove it. ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'Season') obj['ShowId'] = show_id if obj['ShowId'] is None: if not self.get_show_id(obj): return False obj['SeasonId'] = self.get_season(*values(obj, QU.get_season_obj)) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) if obj['Location'] != "Virtual": self.emby_db.add_reference(*values(obj, QUEM.add_reference_season_obj)) self.item_ids.append(obj['Id']) self.artwork.add(obj['Artwork'], obj['SeasonId'], "season") LOG.info("UPDATE season [%s/%s] %s: %s", obj['ShowId'], obj['SeasonId'], obj['Title'] or obj['Index'], obj['Id'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' server_address = self.server.auth.get_server_info( self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'MovieUserData') try: obj['MovieId'] = e_item[0] obj['FileId'] = e_item[1] except TypeError: return obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace( 'T', " ") if obj['Favorite']: self.get_tag(*values(obj, QU.get_tag_movie_obj)) else: self.remove_tag(*values(obj, QU.delete_tag_movie_obj)) LOG.debug("New resume point %s: %s", obj['Id'], obj['Resume']) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.debug("USERDATA movie [%s/%s] %s: %s", obj['FileId'], obj['MovieId'], obj['Id'], obj['Title'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar Make sure there's no other bookmarks created by widget. Create additional entry for widgets. This is only required for plugin/episode. ''' server_data = self.server.auth.get_server_info(self.server.auth.server_id) server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) API = api.API(item, server_address) obj = self.objects.map(item, 'EpisodeUserData') try: obj['KodiId'] = e_item[0] obj['FileId'] = e_item[1] obj['Media'] = e_item[4] except TypeError: return if obj['Media'] == "tvshow": if obj['Favorite']: self.get_tag(*values(obj, QU.get_tag_episode_obj)) else: self.remove_tag(*values(obj, QU.delete_tag_episode_obj)) elif obj['Media'] == "episode": obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace('T', " ") if obj['DateAdded']: obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace('T', " ") self.add_playstate(*values(obj, QU.add_bookmark_obj)) if not self.direct_path and not obj['Resume']: temp_obj = dict(obj) temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj)) temp_obj['Path'] = "plugin://plugin.video.jellyfin/" self.remove_file(*values(temp_obj, QU.delete_file_obj)) elif not self.direct_path and obj['Resume']: temp_obj = dict(obj) temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj)) temp_obj['PathId'] = self.get_path("plugin://plugin.video.jellyfin/") temp_obj['FileId'] = self.add_file(*values(temp_obj, QU.add_file_obj)) self.update_file(*values(temp_obj, QU.update_file_obj)) self.add_playstate(*values(temp_obj, QU.add_bookmark_obj)) self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj)) LOG.info("USERDATA %s [%s/%s] %s: %s", obj['Media'], obj['FileId'], obj['KodiId'], obj['Id'], obj['Title'])
def musicvideo_update(self, obj): ''' Update object to kodi. ''' self.update(*values(obj, QU.update_musicvideo_obj)) self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.info("UPDATE mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
def album_add(self, obj): ''' Add object to kodi. ''' obj['AlbumId'] = self.get_album(*values(obj, QU.get_album_obj)) self.jellyfin_db.add_reference( *values(obj, QUEM.add_reference_album_obj)) LOG.info("ADD album [%s] %s: %s", obj['AlbumId'], obj['Title'], obj['Id'])
def album(self, item, e_item): ''' Update object to kodi. ''' server_address = self.server.auth.get_server_info(self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Album') update = True try: obj['AlbumId'] = e_item[0] obj['LibraryId'] = e_item[6] obj['LibraryName'] = self.jellyfin_db.get_view_name(obj['LibraryId']) except TypeError: update = False library = self.library or find_library(self.server, item) if not library: # This item doesn't belong to a whitelisted library return obj['AlbumId'] = None obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] LOG.debug("AlbumId %s not found", obj['Id']) else: if self.validate_album(*values(obj, QU.get_album_by_id_obj)) is None: update = False LOG.info("AlbumId %s missing from kodi. repairing the entry.", obj['AlbumId']) obj['Rating'] = 0 obj['LastScraped'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') obj['Genres'] = obj['Genres'] or [] obj['Genre'] = " / ".join(obj['Genres']) obj['Bio'] = API.get_overview(obj['Bio']) obj['Artists'] = " / ".join(obj['Artists'] or []) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'ArtworkMusic'), True) obj['Thumb'] = obj['Artwork']['Primary'] obj['DateAdded'] = item.get('DateCreated') if obj['DateAdded']: obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace('T', " ") if obj['Thumb']: obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb'] if update: self.album_update(obj) else: self.album_add(obj) self.artist_link(obj) self.artist_discography(obj) self.update_album(*values(obj, QU.update_album_obj)) self.add_genres(*values(obj, QU.add_genres_obj)) self.artwork.add(obj['Artwork'], obj['AlbumId'], "album") self.item_ids.append(obj['Id'])
def song_update(self, obj): ''' Update object to kodi. ''' self.update_path(*values(obj, QU.update_path_obj)) self.update_song(*values(obj, QU.update_song_obj)) self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj)) LOG.info("UPDATE song [%s/%s/%s] %s: %s", obj['PathId'], obj['AlbumId'], obj['SongId'], obj['Id'], obj['Title'])
def musicvideo_add(self, obj): ''' Add object to kodi. ''' obj['PathId'] = self.add_path(*values(obj, QU.add_path_obj)) obj['FileId'] = self.add_file(*values(obj, QU.add_file_obj)) self.add(*values(obj, QU.add_musicvideo_obj)) self.emby_db.add_reference(*values(obj, QUEM.add_reference_mvideo_obj)) LOG.info("ADD mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
def artist_add(self, obj): ''' Add object to kodi. safety checks: It looks like Emby supports the same artist multiple times. Kodi doesn't allow that. In case that happens we just merge the artist entries. ''' obj['ArtistId'] = self.get(*values(obj, QU.get_artist_obj)) self.emby_db.add_reference(*values(obj, QUEM.add_reference_artist_obj)) LOG.info("ADD artist [%s] %s: %s", obj['ArtistId'], obj['Name'], obj['Id'])
def album_add(self, obj): ''' Add object to kodi. ''' if self.version_id >= 82: obj_values = values(obj, QU.get_album_obj82) else: obj_values = values(obj, QU.get_album_obj) obj['AlbumId'] = self.get_album(*obj_values) self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_album_obj)) LOG.debug("ADD album [%s] %s: %s", obj['AlbumId'], obj['Title'], obj['Id'])
def album(self, item, e_item): ''' Update object to kodi. ''' server_address = self.server.auth.get_server_info( self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Album') update = True try: obj['AlbumId'] = e_item[0] except TypeError: update = False obj['AlbumId'] = None LOG.debug("AlbumId %s not found", obj['Id']) else: if self.validate_album( *values(obj, QU.get_album_by_id_obj)) is None: update = False LOG.info("AlbumId %s missing from kodi. repairing the entry.", obj['AlbumId']) obj['Rating'] = 0 obj['LastScraped'] = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') obj['Genres'] = obj['Genres'] or [] obj['Genre'] = " / ".join(obj['Genres']) obj['Bio'] = API.get_overview(obj['Bio']) obj['Artists'] = " / ".join(obj['Artists'] or []) obj['Artwork'] = API.get_all_artwork( self.objects.map(item, 'ArtworkMusic'), True) obj['Thumb'] = obj['Artwork']['Primary'] if obj['Thumb']: obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb'] if update: self.album_update(obj) else: self.album_add(obj) self.artist_link(obj) self.artist_discography(obj) self.update_album(*values(obj, QU.update_album_obj)) self.add_genres(*values(obj, QU.add_genres_obj)) self.artwork.add(obj['Artwork'], obj['AlbumId'], "album") self.item_ids.append(obj['Id'])
def post(self): user = users.get_current_user() if (not user): self.redirect(users.create_login_url(self.request.uri)) return nickname = self.request.get("nickname") if not self.valid(nickname) == 'valid': values = { 'error' : self.valid(nickname), 'nickname' : nickname } values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/saveloluser.html') self.response.out.write(template.render(path, values)) return loluser = helper.loluser_by_google_user_id(user.user_id()) if (not loluser): loluser = Loluser() loluser.userid = user.user_id() loluser.user = user maxLoluser = Loluser.all().order("-id").get() if not maxLoluser or not maxLoluser.id: loluser.id = 1 else: loluser.id = maxLoluser.id + 1 loluser.nickname = nickname loluser.put() self.redirect('/')
def get(self, userid): loluser = helper.loluser(userid) if not loluser: self.redirect('/notfound') return if (self.request.get('page')): try: intpage = int(self.request.get('page')) except ValueError: self.redirect('/notfound') return else: intpage = 0 posts_per_page = 5 total_posts = db.GqlQuery('select * from Post where userid = :1 order by' + ' date_posted desc', int(userid)).count() posts = db.GqlQuery('select * from Post where userid = :1 order by' + ' date_posted desc limit ' + str(posts_per_page) + ' offset ' + str(intpage*posts_per_page), int(userid)) nextpage = intpage+1 prevpage = intpage-1 if total_posts <= intpage*posts_per_page + posts_per_page: nextpage = -1 values = { 'posts' : posts, 'owner' : loluser, 'page' : str(intpage), 'nextpage' : str(nextpage), 'prevpage' : str(prevpage) } values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/blog.html') self.response.out.write(template.render(path, values))
def artist(self, item, e_item): ''' If item does not exist, entry will be added. If item exists, entry will be updated. ''' server_address = self.server.auth.get_server_info( self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Artist') update = True try: obj['ArtistId'] = e_item[0] obj['LibraryId'] = e_item[6] obj['LibraryName'] = self.jellyfin_db.get_view_name( obj['LibraryId']) except TypeError: update = False library = self.library or find_library(self.server, item) if not library: # This item doesn't belong to a whitelisted library return obj['ArtistId'] = None obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] LOG.debug("ArtistId %s not found", obj['Id']) else: if self.validate_artist( *values(obj, QU.get_artist_by_id_obj)) is None: update = False LOG.info("ArtistId %s missing from kodi. repairing the entry.", obj['ArtistId']) obj['LastScraped'] = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') obj['ArtistType'] = "MusicArtist" obj['Genre'] = " / ".join(obj['Genres'] or []) obj['Bio'] = API.get_overview(obj['Bio']) obj['Artwork'] = API.get_all_artwork( self.objects.map(item, 'ArtworkMusic'), True) obj['Thumb'] = obj['Artwork']['Primary'] obj['Backdrops'] = obj['Artwork']['Backdrop'] or "" if obj['Thumb']: obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb'] if obj['Backdrops']: obj['Backdrops'] = "<fanart>%s</fanart>" % obj['Backdrops'][0] if update: self.artist_update(obj) else: self.artist_add(obj) self.update(obj['Genre'], obj['Bio'], obj['Thumb'], obj['Backdrops'], obj['LastScraped'], obj['ArtistId']) self.artwork.add(obj['Artwork'], obj['ArtistId'], "artist") self.item_ids.append(obj['Id'])
def artist_update(self, obj): ''' Update object to kodi. ''' self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.info("UPDATE artist [%s] %s: %s", obj['ArtistId'], obj['Name'], obj['Id'])
def get(self): user = users.get_current_user() if (not user): self.redirect(users.create_login_url(self.request.uri)) return path = os.path.join(os.path.dirname(__file__), 'html/saveloluser.html') self.response.out.write(template.render(path, helper.values(self.request.uri)))
def album_update(self, obj): ''' Update object to kodi. ''' self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.info("UPDATE album [%s] %s: %s", obj['AlbumId'], obj['Title'], obj['Id'])
def artist_discography(self, obj): ''' Update the artist's discography. ''' for artist in (obj['ArtistItems'] or []): temp_obj = dict(obj) temp_obj['Id'] = artist['Id'] temp_obj['AlbumId'] = obj['Id'] try: temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0] except TypeError: continue self.add_discography(*values(temp_obj, QU.update_discography_obj)) self.jellyfin_db.update_parent_id(*values(temp_obj, QUEM.update_parent_album_obj))
def get(self): if not users.is_current_user_admin(): self.redirect("/accessdenied") return values = {} values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/xpass.html') self.response.out.write(template.render(path, values))
def get_show_id(self, obj): obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj)) if obj['ShowId'] is None: try: self.tvshow(self.server.jellyfin.get_item(obj['SeriesId']), library=None) obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0] except (TypeError, KeyError): LOG.error("Unable to add series %s", obj['SeriesId']) return False else: obj['ShowId'] = obj['ShowId'][0] self.item_ids.append(obj['SeriesId']) return True
def get(self, userid): loluser = helper.loluser(userid) if not loluser: self.redirect('/notfound') else: values = { 'owner' : loluser } values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/loluser.html') self.response.out.write(template.render(path, values))
def boxset(self, item, e_item): ''' If item does not exist, entry will be added. If item exists, entry will be updated. Process movies inside boxset. Process removals from boxset. ''' server_data = self.server.auth.get_server_info( self.server.auth.server_id) server_address = self.server.auth.get_server_address( server_data, server_data['LastConnectionMode']) API = api.API(item, server_address) obj = self.objects.map(item, 'Boxset') obj['Overview'] = API.get_overview(obj['Overview']) try: obj['SetId'] = e_item[0] self.update_boxset(*values(obj, QU.update_set_obj)) except TypeError as error: LOG.debug("SetId %s not found", obj['Id']) obj['SetId'] = self.add_boxset(*values(obj, QU.add_set_obj)) self.boxset_current(obj) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) for movie in obj['Current']: temp_obj = dict(obj) temp_obj['Movie'] = movie temp_obj['MovieId'] = obj['Current'][temp_obj['Movie']] self.remove_from_boxset(*values(temp_obj, QU.delete_movie_set_obj)) self.jellyfin_db.update_parent_id( *values(temp_obj, QUEM.delete_parent_boxset_obj)) LOG.info("DELETE from boxset [%s] %s: %s", temp_obj['SetId'], temp_obj['Title'], temp_obj['MovieId']) self.artwork.add(obj['Artwork'], obj['SetId'], "set") self.jellyfin_db.add_reference( *values(obj, QUEM.add_reference_boxset_obj)) LOG.info("UPDATE boxset [%s] %s", obj['SetId'], obj['Title'])
def get(self, userid): loluser = helper.loluser(userid) if not loluser: self.redirect('/notfound') return books = db.GqlQuery('select * from Book where userid = :1 order by' + ' date_edited desc', int(userid)) values = { 'books' : books, 'owner' : loluser } values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/books.html') self.response.out.write(template.render(path, values))
def remove(self, item_id, e_item): ''' Remove mvideoid, fileid, pathid, emby reference. ''' obj = {'Id': item_id} try: obj['MvideoId'] = e_item[0] obj['FileId'] = e_item[1] obj['PathId'] = e_item[2] except TypeError: return self.artwork.delete(obj['MvideoId'], "musicvideo") self.delete(*values(obj, QU.delete_musicvideo_obj)) if self.direct_path: self.remove_path(*values(obj, QU.delete_path_obj)) self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj)) LOG.info("DELETE musicvideo %s [%s/%s] %s", obj['MvideoId'], obj['PathId'], obj['FileId'], obj['Id'])
def add_streams(self, file_id, streams, runtime): ''' First remove any existing entries Then re-add video, audio and subtitles. ''' self.cursor.execute(QU.delete_streams, (file_id,)) if streams: for track in streams['video']: track['FileId'] = file_id track['Runtime'] = runtime self.add_stream_video(*values(track, QU.add_stream_video_obj)) for track in streams['audio']: track['FileId'] = file_id self.add_stream_audio(*values(track, QU.add_stream_audio_obj)) for track in streams['subtitle']: self.add_stream_sub(*values({'language': track, 'FileId': file_id}, QU.add_stream_sub_obj))
def remove(self, item_id, e_item): ''' Remove movieid, fileid, jellyfin reference. Remove artwork, boxset ''' obj = {'Id': item_id} try: obj['KodiId'] = e_item[0] obj['FileId'] = e_item[1] obj['Media'] = e_item[4] except TypeError: return self.artwork.delete(obj['KodiId'], obj['Media']) if obj['Media'] == 'movie': self.delete(*values(obj, QU.delete_movie_obj)) elif obj['Media'] == 'set': for movie in self.jellyfin_db.get_item_by_parent_id( *values(obj, QUEM.get_item_by_parent_movie_obj)): temp_obj = dict(obj) temp_obj['MovieId'] = movie[1] temp_obj['Movie'] = movie[0] self.remove_from_boxset( *values(temp_obj, QU.delete_movie_set_obj)) self.jellyfin_db.update_parent_id( *values(temp_obj, QUEM.delete_parent_boxset_obj)) self.delete_boxset(*values(obj, QU.delete_set_obj)) self.jellyfin_db.remove_item(*values(obj, QUEM.delete_item_obj)) LOG.info("DELETE %s [%s/%s] %s", obj['Media'], obj['FileId'], obj['KodiId'], obj['Id'])
def episode_add(self, obj): ''' Add object to kodi. ''' obj['RatingId'] = self.create_entry_rating() self.add_ratings(*values(obj, QU.add_rating_episode_obj)) obj['Unique'] = self.create_entry_unique_id() self.add_unique_id(*values(obj, QU.add_unique_id_episode_obj)) obj['PathId'] = self.add_path(*values(obj, QU.add_path_obj)) obj['FileId'] = self.add_file(*values(obj, QU.add_file_obj)) try: self.add_episode(*values(obj, QU.add_episode_obj)) except sqlite3.IntegrityError as error: LOG.error("IntegrityError for %s", obj) obj['EpisodeId'] = self.create_entry_episode() return self.episode_add(obj) self.emby_db.add_reference( *values(obj, QUEM.add_reference_episode_obj)) LOG.debug("ADD episode [%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['Id'], obj['Title'])
def boxset_current(self, obj): ''' Add or removes movies based on the current movies found in the boxset. ''' try: current = self.jellyfin_db.get_item_id_by_parent_id( *values(obj, QUEM.get_item_id_by_parent_boxset_obj)) movies = dict(current) except ValueError: movies = {} obj['Current'] = movies for all_movies in server.get_movies_by_boxset(obj['Id']): for movie in all_movies['Items']: temp_obj = dict(obj) temp_obj['Title'] = movie['Name'] temp_obj['Id'] = movie['Id'] try: temp_obj['MovieId'] = self.jellyfin_db.get_item_by_id( *values(temp_obj, QUEM.get_item_obj))[0] except TypeError: LOG.info("Failed to process %s to boxset.", temp_obj['Title']) continue if temp_obj['Id'] not in obj['Current']: self.set_boxset(*values(temp_obj, QU.update_movie_set_obj)) self.jellyfin_db.update_parent_id( *values(temp_obj, QUEM.update_parent_movie_obj)) LOG.info("ADD to boxset [%s/%s] %s: %s to boxset", temp_obj['SetId'], temp_obj['MovieId'], temp_obj['Title'], temp_obj['Id']) else: obj['Current'].pop(temp_obj['Id'])
def artist(self, item, e_item, library, *args, **kwargs): ''' If item does not exist, entry will be added. If item exists, entry will be updated. ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'Artist') update = True try: obj['ArtistId'] = e_item[0] except TypeError as error: update = False obj['ArtistId'] = None LOG.debug("ArtistId %s not found", obj['Id']) else: if self.validate_artist( *values(obj, QU.get_artist_by_id_obj)) is None: update = False LOG.info("ArtistId %s missing from kodi. repairing the entry.", obj['ArtistId']) obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] obj['LastScraped'] = datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S') obj['ArtistType'] = "MusicArtist" obj['Genre'] = " / ".join(obj['Genres'] or []) obj['Bio'] = API.get_overview(obj['Bio']) obj['Artwork'] = API.get_all_artwork( self.objects.map(item, 'ArtworkMusic'), True) obj['Thumb'] = obj['Artwork']['Primary'] obj['Backdrops'] = obj['Artwork']['Backdrop'] or "" if obj['Thumb']: obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb'] if obj['Backdrops']: obj['Backdrops'] = "<fanart>%s</fanart>" % obj['Backdrops'][0] if update: self.artist_update(obj) else: self.artist_add(obj) self.update(obj['Genre'], obj['Bio'], obj['Thumb'], obj['Backdrops'], obj['LastScraped'], obj['ArtistId']) self.artwork.add(obj['Artwork'], obj['ArtistId'], "artist") self.item_ids.append(obj['Id'])
def get(self): user = users.get_current_user() loluser = helper.loluser_by_google_user_id(user.user_id()) if not helper.check_for_loluser(self): return if self.request.get('key'): try: post = db.get(db.Key(self.request.get("key"))) except BadKeyError: self.redirect('/notfound') return if not helper.check_for_existence_and_ownership(post, self): return values = { 'post' : post } else: values = {} values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/editpost.html') self.response.out.write(template.render(path, values))
def get(self): loluser = helper.loluser_by_google_user_id(users.get_current_user().user_id()) if not helper.check_for_loluser(self): return if self.request.get('key'): book = db.get(db.Key(self.request.get("key"))) if not book: self.redirect("/notfound") return if book.userid != loluser.id: self.redirect("/accessdenied") return values = { 'book' : book } else: values = {} values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/editbook.html') self.response.out.write(template.render(path, values))
def get(self, userid, postid): loluser = helper.loluser(userid) if not loluser: self.redirect('/notfound') return post = Post.gql('where id = :1', int(postid)).get() if not post or post.userid != loluser.id: self.redirect('/notfound') return comments = db.GqlQuery('select * from Comment where post = :1 order by' + ' date_posted asc', post) root = TempComment() root.children = [] hm = {} for comment in comments: tmp = TempComment() tmp.me = comment tmp.children = [] if comment.parent_comment: par = hm[comment.parent_comment.id] else: par = root hm[comment.id] = tmp par.children.append(tmp) #for child in root.children: # print child.children comments = [] for child in root.children: self.append_all(child, comments) values = { 'post' : post, 'owner' : loluser, 'comments' : comments } values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/post.html') self.response.out.write(template.render(path, values))
def get(self): path = os.path.join(os.path.dirname(__file__), 'html/saveyourloluser.html') self.response.out.write(template.render(path, helper.values(self.request.uri)))
def get(self): values = {} values.update(helper.values(self.request.uri)) path = os.path.join(os.path.dirname(__file__), 'html/js1.html') self.response.out.write(template.render(path, values))