Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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'])
Beispiel #4
0
    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'])
Beispiel #5
0
    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'])
Beispiel #6
0
    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'])
Beispiel #7
0
    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'])
Beispiel #8
0
    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'])
Beispiel #9
0
    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'])
Beispiel #10
0
    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'])
Beispiel #12
0
 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'])
Beispiel #13
0
    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'])
Beispiel #14
0
    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'])
Beispiel #15
0
    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'])
Beispiel #16
0
    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'])
Beispiel #17
0
    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'])
Beispiel #18
0
    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'])
Beispiel #19
0
    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('/')
Beispiel #20
0
 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))
Beispiel #21
0
    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'])
Beispiel #22
0
 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'])
Beispiel #23
0
 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)))
Beispiel #24
0
 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'])
Beispiel #25
0
    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))
Beispiel #26
0
 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))
Beispiel #27
0
    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
Beispiel #28
0
 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))
Beispiel #29
0
    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'])
Beispiel #30
0
 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))
Beispiel #31
0
    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'])
Beispiel #32
0
    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))
Beispiel #33
0
    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'])
Beispiel #34
0
    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'])
Beispiel #35
0
    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'])
Beispiel #36
0
    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'])
Beispiel #37
0
 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))
Beispiel #38
0
 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))
Beispiel #39
0
    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))
Beispiel #40
0
 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)))
Beispiel #41
0
 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))