Ankündigung

Einklappen
Keine Ankündigung bisher.

Google Calendar - update für "neue" GoogleAPI

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Wie heißt es so schön - Schuster, bleib bei Deinen Leisten. Von iCloud hab ich null Ahnung und nicht mal einen Account. Ich werde aber den ownCloud / NextCloud Treiber gern so erweitern, dass Kategorien und Farben übernommen werden, sofern der Provider diese liefert (bei OC/NC werden definitiv Kategorien geliefert - Farben muss ich erst nachsehen). Da der Treiber auf dem für calDav basiert, ist das dann auch gleich eine Vorlage für andere Kalendertypen ...

    /tom

    Kommentar


      Der ownCloud Treiber ist leidrr nicht sehr gut implementiert, deshalb habe ich ihn auch noch nicht ins Repository aufgenommen.
      Aber iCloud ist ebenfalls CalDav, deshalb denke ich, dass dieser mit wenig Aufwand in einen generischen CalDav-Treiber umgebaut werden könnte.

      Da das Datenformat bei CalDav ja ebenfalls iCal ist, einfach mit XML-Metadaten gewrappt, sollte diese meiner Meinung nach denselben iCal-Parser nutzen.
      Dies ist beim iCal und iCloud Treiber bereits der Fall.

      So braucht es eigentlich nur noch zwei Treiber, einen reinen iCal und einen mit dem CalDav Wrapping. Und von mir aus noch den Google API v3, obwohl dieser, wie man hier sieht, nicht Massentauglich ist.

      Kommentar


        Zitat von smai Beitrag anzeigen
        Tom Bombadil wenn du Zeit ubd Lust hast, kannst du gerne den iCloud-Treiber so umbauen, dass er generisch für CalDav verwendet werden kann.
        Aus dem iCal-Treiber lässt sich zumindest mit Google nicht mehr rausholen, da nützt also weiterer Zeiteinsatz nichts.

        Da der Google V3 Treiber bei mir mittlerweile auch nicht mehr funktioniert, da einige Zeit inaktiv, habe ich umgestellt auf iCal und das Farb-Thema anders gelöst.

        Ich habe für den iCal-Treiber einen Kompromiss gefunden, indem ich den Treiber um die Farbzuordnung erweitert habe, der zugehörige Wert kommt aus dem Event-Feld URL, das ich vor dem Import in den Google-Kalender für die jeweiligen Event-Arten manuell unterschiedliche befülle. Da das nur einmal jährlich passiert, ist das vom Aufwand kein Problem.

        Da ich mir bei der AWG Rems Murr einen individuellen Abfallkalender erzeugen lassen kann, exportiere ich je Terminart getrennt, bereite das Feld URL entsprechend mit Suchen und Ersetzen auf und importiere dann in Google.

        Die Schritte sind daher:

        1.) Export der jeweiligen Terminarten, also je Art eine Datei (1=Restmüll,2=Bio,3=Papier,4=Gelb,5=Grüngut,6=Chri stbaum) als .ics-Datei

        2.) Ersetzen des URL-Feldes durch die jeweilige Terminart: URL:1 ist somit Restmüll, URL:2 ist Bio usw. in der .ics-Datei vor dem Import

        Code:
        BEGIN:VCALENDAR
        PRODID:http://www.athos.com/calendarwebapplication/
        VERSION:2.0
        METHOD:PUBLISH
        CHARSET:UTF-8
        BEGIN:VEVENT
        DTSTART;VALUE=DATE:20160114
        DTEND;VALUE=DATE:20160115
        LOCATION;LANGUAGE=de:SCHLEHENWEG    2, 71397 LEUTENBACH
        TRANSP:TRANSPARENT
        SEQUENCE:0
        UID:     644981
        DTSTAMP:20161113T000223Z
        DESCRIPTION;LANGUAGE=de:
        SUMMARY;LANGUAGE=de:Restmülltonne
        PRIORITY:9
        CLASS:PUBLIC
        [COLOR=#FF0000][B]URL:1[/B][/COLOR]
        STATUS:CONFIRMED
        END:VEVENT

        3.) Import der Dateien in einen eigenen Google "Müllkalender", dessen URL dann für diesen Zweck verwendet werden kann.

        4.) Austausch/Erweiterung der Datei "iCal_(e.g._Google).php":

        Die Farbzuordnung erfolgt statisch zur Terminart, entsprechend können bei Bedarf die Farben einfach ausgetauscht werden.

        Code:
        <?php
        /**
         * -----------------------------------------------------------------------------
         * @package     smartVISU
         * @author      Martin Gleiß
         * @copyright   2012 - 2015
         * @license     GPL [http://www.gnu.de]
         * -----------------------------------------------------------------------------
         */
        
        
        require_once '../../../lib/includes.php';
        require_once const_path_system.'calendar/calendar.php';
        require_once const_path_system.'calendar/ICal/ICal.php';
        require_once const_path_system.'calendar/ICal/EventObject.php';
        
        use ICal\ICal;
        
        /**
         * This class reads a google calendar
         */
        class calendar_google extends calendar
        {
        
        
        [COLOR=#FF0000][B]/* Add Colors per event type    */
        protected $EventTypeColor = array(
             1 => '#000000',        // Restmüll
             2 => '#663300',        // Bio    
             3 => '#0033cc',        // Papier
             4 => '#ffff00',        // Gelbe Tonne
             5 => '#00b33c',        // Grüngut
             6 => '#33cc33'            // Christbaum
        );[/B][/COLOR]
            /**
             * initialization of some parameters
             */
            public function init($request)
            {
                parent::init($request);
        
                //$this->url = preg_replace('#/basic(\.ics)?$#', "/full.ics?maxResults=".(int)$request['count']."&timeMin=2016-07-03T00:00:00Z&singleEvents=true&orderBy=startTime&sortOrder=a", $this->url);
            }
        
            public function run()
            {
                        $ics = new ICal($this->url);
                        $events = $ics->eventsFromRange("today",false);
                        $events = array_slice($events, 0, $this->count);
                    // output events as list
                    $i = 1;
                foreach ($events as $event) {
                  $this->data[] = array('pos' => $i++,
                    'start' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtstart)),
                    'end' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtend)),
                    'title' => $event->summary,
                    'content' => str_replace("\\n", "\n", $event->description),
                    'where' => $event->location,
        
        [COLOR=#FF0000][B]// Assign color based on URL property of the event (not the .ics URL but of the event creator)            
        // Requires a pre-processing of the .ics file before importing it to google calendar
                'color' => $this->EventTypeColor[$event->url],
        //[/B][/COLOR]
                    //,'link' => ''
                  );
                }
          }
        }
        
        
        // -----------------------------------------------------------------------------
        // call the service
        // -----------------------------------------------------------------------------
        
        $service = new calendar_google(array_merge($_GET, $_POST));
        echo $service->json();
        
        ?>
        Und das Ergebnis sieht dann so aus:

        iCalExample2.jpg


        Termine ohne angepassten URL-Feldinhalt werden entsprechend mit der Hintergrundfarbe dargestellt (z.B. manuell angelegter Testtermin).
        Greetings, Torsten

        Kommentar


          Farbe und Icon für einzelne Termine bzw. Serien können übrigens auch im iCal-Treiber per @color und @icon in der Beschreibung gesetzt werden.

          Kommentar


            Hallo,

            wo muss ich das genau hinschreiben, verstehe nicht was du mit "iCal-Treiber per @color und @icon" genau meinst wo muss ich da was einfügen in welcher Datei?

            Vielen Dank Gruß Jan

            Kommentar


              Habe ich ja geschrieben: In der Beschreibung des Termins (keine Ahnung, wie das in der iCloud genau heisst).
              Steht auch im Beitrag #6 dieses Threads.

              Kommentar


                Hallo Jan,

                hier mal ein Beispiel aus meinem ownCloud-Kalender:

                Kalender1.png

                Falls es Dir nur um Mülltermine geht, kannst Du auch die praktische Kompaktdarstellung nehmen, siehe hier. Die braucht auch keine Farb- und Iconcodes.

                Kalender2.png

                /tom

                Kommentar


                  Hallo,

                  das ist mir so schon klar aber ich will doch nicht immer den Pfad des Icons angeben sondern Sprechende Wörter haben wie z.B. Party oder so

                  (Party)
                  ICON f56257w
                  @party /xx/xx/xx

                  Geht so etwas nicht, und kann ich irgendwo Default Icons vergeben?
                  Danke
                  Gruß Jan

                  Kommentar


                    Zitat von flipkill1985 Beitrag anzeigen
                    Geht so etwas nicht, und kann ich irgendwo Default Icons vergeben?
                    Leider nein und nein.

                    Wünschenswert wäre für mich, dass man eine Liste von Wörtern mit Icons angeben könnte und wenn eines der Wörter im Termin vorkommt, dann wird das entsprechende Icon verwendet.
                    Die Google Kalender-App für Android macht wohl was ähnliches, bei bestimmten Begriffen wird da im Header auch ein passendes Hintergrundbild angezeigt.

                    Wenn mir mal langweilig ist, implementiere ich das vielleicht. Leider habe ich so viele gute Ideen und so wenig Zeit ;-)
                    Ich habe dies mal als Issue 128 erfasst.
                    Zuletzt geändert von smai; 17.12.2016, 21:11. Grund: Issue hinzugefügt

                    Kommentar


                      Zitat von smai Beitrag anzeigen
                      Wünschenswert wäre für mich, dass man eine Liste von Wörtern mit Icons angeben könnte und wenn eines der Wörter im Termin vorkommt, dann wird das entsprechende Icon verwendet
                      ....
                      Ich habe dies mal als Issue 128 erfasst.
                      Toll das mein Vorschlag jetzt vielleicht doch so in etwa umgesetzt wird
                      Zitat von nEiMi Beitrag anzeigen
                      Wäre es nicht möglich das mit Suchbegriffen in einer Datei zu lösen... z.B. so:
                      Code:
                      [Kalender]
                      [Papiertonne]
                      Betreff = Papiertonne
                      icon = message_garbage.svg
                      color = #04B404
                      
                      [Autowerkstatt]
                      Ort = Volkswagen
                      icon = message_service.svg
                      color = #FFFFFF
                      cu Yfkt5A
                      DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                      microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                      Kommentar


                        Nun, mit steigender Nachfrage werde ich nachgiebig

                        Sinnvoll für den Filter wären wohl die Felder title (= Betreff), content (= Beschreibung) und where (= Ort).

                        Da dies sprachabhängig ist, würde ich es wohl in die lang_XX.txt aufnehmen.
                        Vom Datenkonstrukt her bietet sich deshalb ein assoziatives Array an, dein INI-Code würde dann so aussehen:

                        PHP-Code:
                        $lang['calendar']['tag'][] = ['filter' => ['title' => 'Papiertonne'], 'icon' => 'message_garbage.svg''color' => '#04B404' ];
                        $lang['calendar']['tag'][] = ['filter' => ['where' => 'Volkswagen'], 'icon' => 'message_service.svg' ]; 
                        Dabei würde ich den ersten Eintrag anwenden, der auf einen Teil des betreffenden Feldes passt (unabhängig von Gross-/Kleinschreibung).
                        Sind mehrere Felder angegeben (also z.B. title und where) müssen alle passen.


                        Im Release lassen sich sicher nicht alle erdenklichen Schüsselwörter einbeziehen, aber ich möchte zumindest die wichtigsten mit ausliefern. Dazu brauche ich euren Input, was für euch von Bedeutung ist.
                        Ich schlage mal folgendes vor und nehme eure Ergänzungen gerne entgegen:
                        title icon color
                        Grüne Tonne message_garbage.svg #008000
                        Blaue Tonne message_garbage.svg #0000ff
                        Gelbe Tonne message_garbage.svg #ffff00
                        Papiertonne message_garbage.svg #ffff00
                        Altpapier message_mail_open.svg
                        Braune Tonne message_garbage.svg #a52a2a
                        Biotonne message_garbage.svg #a52a2a
                        Grünabfuhr message_garbage.svg #008000
                        Graue Tonne message_garbage.svg #000000
                        Schwarze Tonne message_garbage.svg #000000
                        Kehricht message_garbage.svg #000000
                        Kino scene_scene.svg
                        Sport scene_fitness.svg
                        Fitness scene_fitness.svg
                        Fussball scene_football.svg
                        Ferien status_vacation.svg
                        Urlaub status_vacation.svg
                        Party scene_party.svg
                        Geburtstag scene_party.svg
                        Feier scene_party.svg
                        Arzt message_medicine.svg
                        Gärtner scene_garden.svg

                        Kommentar


                          Gefühlt wäre eine. cfg wahrscheinlich auf lange Sicht einfacher zu warten, aber die lang_xx.txt tut's sicher auch.

                          Könntest Du in diesem Zuge auch gleich die Kategorien implementieren (sofern vom Provider geliefert)? So wie ich es bis jetzt verstehe, müsste dafür eigentlich nur folgendes geändert werden:

                          lib/calendar/service/iCloud.php ab Zeile 92:
                          Code:
                          [FONT=courier new]    foreach ($events as $event) {
                                 $this->data[] = array('pos' => $i++,
                                  'start' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtstart)),
                                  'end' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtend)),
                                  'title' => $event->summary,
                                  'content' => '',
                                  'where' => str_replace(array("\n\r", "\n", "\r", "\\"), "<br />", $event->location),
                                  'link' => 'https://www.icloud.com/#calendar'[COLOR=#FF0000],[/COLOR][/FONT]
                          [COLOR=#FF0000][FONT=Courier New]       'categories' => $event->categories  [/FONT][/COLOR][FONT=Courier New][COLOR=#ff0000]   // new for categories[/COLOR][/FONT]
                          [FONT=courier new]     );
                              }[/FONT]
                          lib/calendar/service/iCal.php ab Zeile 32:
                          Code:
                          [FONT=courier new]      foreach ($events as $event) {
                                    $this->data[] = array('pos' => $i++,
                                      'start' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtstart)),
                                      'end' => date('y-m-d H:i:s', $ics->iCalDateToUnixTimestamp($event->dtend)),
                                      'title' => $event->summary,
                                      'content' => str_replace("\\n", "\n", $event->description),
                                      'where' => $event->Location[COLOR=#FF0000],[/COLOR][/FONT]
                          [FONT=Courier New]           //,'link' => ''[/FONT]
                          [COLOR=#FF0000][FONT=Courier New]           'categories' => $event->categories [/FONT][/COLOR][FONT=Courier New][COLOR=#ff0000]// new for categories[/COLOR][/FONT]
                          [FONT=courier new]        );
                                  }[/FONT]

                          lib/calendar/service/ownCloud.php ab Zeile 81:
                          Code:
                          [FONT=courier new]         if($name == 'DTEND')
                                      {
                                          preg_match('/((.*)=(.*):)?(.*)/', $value, $matches);
                                          //TODO TZID handling
                                          date_default_timezone_set('Europe/Berlin');
                                          $ts = strtotime($matches[4]) + date("Z", strtotime($matches[4]));
                                          $this->vevent['end'] = date('y-m-d', $ts).' '.gmdate('H:i:s', $ts);
                                      }
                          
                          [COLOR=#FF0000]         if($name == 'CATEGORIES')  [/COLOR][/FONT][FONT=Courier New][COLOR=#ff0000]// new for categories[/COLOR][/FONT]
                          [COLOR=#FF0000][FONT=Courier New]          {[/FONT]
                          [FONT=courier new]              $this->vevent['categories'] = (string)($value);[/FONT]
                          [FONT=Courier New]          }[/FONT][/COLOR]
                          Das würde die Filterung von Events massiv vereinfachen, sofern wie gesagt der Provider die Kategorien auch liefert (z.B. ownCloud / nextCloud, siehe #161; aber bestimmt auch andere).

                          Nachbemerkung: Vermutlich wäre das Einlesen in ein Array statt in einen String sogar noch eleganter, aber mit php-Arrayfunktionen kenne ich mich leider nicht aus.

                          /tom
                          Zuletzt geändert von Tom Bombadil; 21.12.2016, 17:50.

                          Kommentar


                            Und was soll mit den categories geschehen? Einfach für die Vergabe von Icons zur Verfügung stehen?
                            ownCloud ist übrigens gar nicht Teil der SV.

                            Kommentar


                              Hallo,

                              @smai
                              Also mir würde die Liste die du da hast vollkommen reichen das wäre so ein Traum.

                              Gruß Jan

                              Kommentar


                                Zitat von smai Beitrag anzeigen
                                Und was soll mit den categories geschehen? Einfach für die Vergabe von Icons zur Verfügung stehen?
                                Neben einigen anderen Feldern, die noch nicht abgedeckt werden, kennen viele Provider halt auch Kategorien, siehe auch iCalendar Spezifikation hier, Abschnitt 4.8.

                                Beispiel: Schau Dir mal das Müll-Widget weiter oben an - zur Zeit werden da Termine nach Namen gefiltert (z.B. Blaue Tonne, Gelbe Tonne etc). Das wird sich mit den von Dir oben beschriebenen Filtern nicht ändern.

                                Eleganter wäre eine Kategorie 'Müll', wie ich sie zwar schon in meinem ownCloud-Kalender oder in Outlook definieren kann, die derzeit nirgendwo ausgewertet wird.
                                Jetzt kann ich in dem Widget schreiben: Liste alle Termine, die der Kategorie 'Müll' angehören, egal was im Titel steht.

                                Genauso könnte man z.B. Familienmitgliedern jeweils eine Kategorie zuweisen und für die Ausgabe entsprechend filtern / gruppieren, und Deine Filter noch zusätzlich für die Zuweisung von Icons / Farben nutzen..

                                Ich gebe zu, das ist kein Endnutzer-Feature, sondern eher etwas für Leute, die eigene Widgets und Erweiterungen schreiben.

                                Zitat von smai Beitrag anzeigen
                                ownCloud ist übrigens gar nicht Teil der SV.
                                Nimm's halt auf - wer, wenn nicht Du?

                                Eine Möglichkeit mehr, den nicht mehr funktionierenden Google-Kalender zu ersetzen. Ich bin mir sicher, dass viele die Möglichkeit schätzen, für ihre Kalenderdaten nicht erst zu Google oder Apple telefonieren zu müssen. Zumal ja für die sV sowieso ein Webserver laufen muss, dann ist es halt eine lokale Installation (own-/nextCloud) mehr.

                                Die Anbindung von Morg funktioniert hier einwandfrei, nur die Konfiguration ist bei manchen etwas hakelig, da je nach Version unterschiedliche Pfade zur ics angegeben werden müssen. Aber darum können wir uns hier im Forum kümmern, ggf. erstelle ich eine kurze Doku. Rest und Code siehe hier.

                                /tom
                                Zuletzt geändert von Tom Bombadil; 21.12.2016, 21:27.

                                Kommentar

                                Lädt...
                                X