mediathekview / plugin.video.mediathekview

Kodi plugin that gives access to most video-platforms from German public service broadcasters using the database of MediathekView.de
https://mediathekview.de/download/#mediathekview-f%C3%BCr-kodi-fr%C3%BCher-xbmc
MIT License
55 stars 25 forks source link

Question w.r.t. SQL (SQLite and MySQL) Amazon Fire-TV-Stick #158

Closed Marmos76 closed 4 years ago

Marmos76 commented 4 years ago

Moin zusmammen, ich habe einmal generelle Fragen zu der MySQL Variante ....

a) wie wird diese initialisiert ? Wird darauf geachtet, dass wenn die Tabellen nicht vorhanden sind, die erstellt und dann aktualisiert werden ?

b) was ist wenn sich eine Tabelle ändert ?

c) Was passiert mit der heruntergeladenen sqlitedb Datei (filmliste-v2.db.xz) ? Wird diese nach der synchronizierung gelöscht?

d) Wie passiert die syschronisierung? Ist das ein Dump ?

Hintergrund ist der dass die Variante mit dem MySQL Server ganz schick finde. Ich habe entspr. Webspace und würde dort gern die MySQL DB Variante nutzen. Macht aber eigenltich nur Sinn, wenn die Sqlite Datei anschließend auch gelöscht werden würde, um so Speicherplatz zu sparen. (Gerade auf dem Amazon Fire Stick)

Danke im Voraus !!

codingPF commented 4 years ago

Hi, zu den Fragen: a) Wenn du einfach eine leere Mysql anlegst, wird eine DB Mediathekview mit allen Tabellen angelegt. Das ist der einfachste Weg.

b) Was heißt ändern? Weitere Spalten hinzufügst? Manuell editierst? Generell werden die Tabellen vom Updater in sync gehalten (mit der letzten Filmliste)

c) Die update Dateien (increment & full) werden nach dem update in die mySql DB gelöscht.

d) Im Updater gibt eine eine Sektion die aus der Quelldatei (increment & full) dann insert / update stmts baut und auf die DB schickt. Wenn man es genau nimmt, dann wird eine Update/Insert procedure in der DB angelegt und diese dann Zeile für Zeile aufgerufen. D.h. du machst einen cron auf das mvupdates script und rufst dieses z.B. einmal pro Stunde auf. Der Updater prüft dann ob es ein update gibt und führt dieses durch.

Generell wird einmal pro Tag ein full update gemacht und dann über Tag ein increment update.

Marmos76 commented 4 years ago

Danke für Deine Antworten. Leider funtioniert das bei mir irgendwie nicht. Ich habe eine DB erstellt mit Name mediatheview und den Benutzer mediathekview erzeugt. Diese Daten bei den Optionen für die MySQL Datenbank entspr. eingegeben und es erscheint allein : "Bitte warten Sie während die DB aktualisert wird." Okay ! Aber es endet anscheinend gefühlt nie und in der Datenbank ändert sich nichts. Keine Ahnung was da hängt. ... Login ? ... Datenbank Kodierung ? ... falsches Tabellenschema bei der Konviertierung von SQLite zu MySQL

Es werden auf jeden Fall keine neuen Tabellen angelegt usw. Seufz

PS: shell command mit gleichen login daten funktioniert einwandfrei !

codingPF commented 4 years ago

Du darfst keine DB/Schema anlegen...einfach nur einen user anlegen und ab...die DB/Schema mediathekview wird dann angelgt + Tabellen. Versuch das mal....sonst musst du Betriebsystem + log posten...

Marmos76 commented 4 years ago

Das jetzt etwas seltsam.... Mein Provider heißt Febas. Hier muss man eine Datenbank mit einem Benutzer anlegen. Erst dann ist eine Datenbank vorhanden. Davor gibt es weder Datenbank noch einen Benutzer. Wenn man den externen Login nicht explizit erlaubt dann kann sich der Benutzer nicht einloggen (Fehlermeldung ; no access for user mediathekview !). Okay Zugriff nicht erlaubt.

So nun den externen Zugriff extra erlaubt und es erscheint die Meldung : "Please wait while the system upgrades the database scheme."

Folglich hat der Benutzer ja schon einmal Zugriff und darf sich einloggen. Also es soll sich etwas tun. Aber dennoch werden anscheinend keinerlei Tabellen angelegt etc.

mysql shell commands funktionieren aber .... mysql -h server.febas.net -D mediathekview -u mediathekview --password=** -e 'create table test ( namen varchar(25), firstname varchar(25), age int ); ' mysql -h server.febas.net -D mediathekview -u mediathekview --password=** -e 'drop table test '

mysql -h server.febas.net -D mediathekview -u mediathekview --password=** -e 'show tables' +-------------------------+ | Tables_in_mediathekview | +-------------------------+ | pmabookmark | | pmacentral_columns | | pmacolumn_info | | pma__designer_settings | | pmaexport_templates | | pmafavorite | | pmahistory | | pmanavigationhiding | | pmapdf_pages | | pmarecent | | pmarelation | | pmasavedsearches | | pmatable_coords | | pmatable_info | | pma__table_uiprefs | | pmatracking | | pmauserconfig | | pmausergroups | | pma__users | +-------------------------+

Marmos76 commented 4 years ago

mysql -h ... -e 'create table test ( namen varchar(25), firstname varchar(25), age int ); ' mysql -h ... -e 'insert into test (namen, firstname, age) values( "Mar","Mos", 43 ); ' mysql -h ... -e "select * from test;" +-------+-----------+------+ | namen | firstname | age | +-------+-----------+------+ | Mar | Mos | 43 | +-------+-----------+------+

codingPF commented 4 years ago

Wenn das so bei dir nicht klappt, dann kannst du die DB Script in resource/lib/storemysql.py Zeile 1006 anschauen, kopieren und von Hand ausführen. Bitte auch die procedure anlegen und den insert in die Status Tabelle nicht vergessen.

Marmos76 commented 4 years ago

Okay ... ich habe diese Datei kopiert und umgestrickt so dass ich quasi alles bis auf die function def _handle_database_initialization(self) (von Zeile1006 an) gelöscht habe und einen eigenen Mysql-Connect eingefügt habe. Also eine Standalone-Version mit main-Methode. Wichtig war noch das sql-statement "CREATE DATABASE ..." auszukommentieren. Danach habe ich die Datei ausführt und konnte die Tabellen entspr. anlegen. Und das Update läuft und läuft und läuft .... aber es tut sich etwas ;-)

Insgesamt sollte man daher vllt. doch die DB-Erstellung abändern auf ... 'CREATE DATABASE IF NOT EXISTS {} DEFAULT CHARACTER SET utf8'.format(self.settings.database)' also nur erzeugnen, wenn diese noch nicht vorhanden ist. Genau diese Zeile führte bei mir zu dem Fehlverhalten, weil die Datenbank in meinem Fall ja bereits exitierte und auch existieren musste. Ohne Datenbank auch keinen Benutzer und keine Login etc.

und im Fehlerfall eben dann entspr. nur die Tabellen und Prozeduren einzeln löschen und nicht sogleich die ganze Datenbank.

Marmos76 commented 4 years ago

noch einmal so geschildert für 4000 Einträge (1%) benötigt das das Update 28 Minuten ... also für 100% dann geschätzt 2800 Minuten .... zwei Tage am Stück. Das dauert mir dann doch ein klein wenig zu lange.

codingPF commented 4 years ago

Auf einem "normalen" MySql Server hast du auch Benutzer ohne DB...überlegt mal wie das mit root ist :-) Aber ich finde die Idee gut und habe es in den Code übernommen. Dabei besteht natürlich die Gefahr, dass man die DB mit dem falschen Charset anlegt...

Mit der performance bin ich auch nicht zufrieden (dauert bei mir 30 min) aber das ist nicht so einfach...vielleicht versuchst du es mit der lokal sqllite variante oder mit MV / MVW.

Marmos76 commented 4 years ago

Im master war das noch nicht enthalten. Daher habe dafür ein neue Issue aufgemacht und meine Variante der storemysql.py hochgeladen. Leider verstehe ich gerade die Berechtigungen nicht wer/wie/was/wann/wo committen und pushen darf oder auch nicht. ;-)

codingPF commented 4 years ago

Released to official Kodi Repo in v0.6.4